关于 JS 原型的知识点

如果有一个构造函数
Foo,那么在内存中就存在一个 显式原型对象Foo.prototype。
constructor 属性,指向构造函数本身:Foo.prototype.constructor === Foo如果一个对象
a是由构造函数Foo创建的(const a = new Foo()),那么:
__proto__ 是对象的隐式原型(非标准但广泛支持,标准是 Object.getPrototypeOf(a))。a.x 时,先找自身,再通过 __proto__ 找 Foo.prototype。Object.prototype所有函数的
prototype对象(如Foo.prototype)本质上都是普通对象,而所有普通对象都是由Object构造的。
所以:
Foo.prototype 可以使用 Object.prototype 上的方法,如 hasOwnProperty、toString 等。Object.prototype 是原型链的最终终点。Function 构造函数的特殊点Function 的实例在 JavaScript 中,函数是一等公民,而所有函数(包括构造函数)本质上都是
Function构造出来的对象。
所以:
Function 是唯一能“自我构造”的函数
Function作为函数,是由它自己创建的。
Function 成为“函数的始祖”,所有函数都通过它诞生。__proto__ === prototype 的函数。Object 构造函数的特殊点Object 是顶层构造函数
Object是 JavaScript 中最基础的构造函数,所有对象都直接或间接继承自它。
它的原型对象是:
Object.prototype。toString、valueOf、hasOwnProperty 等。Object.prototype 是原型链的终点
Object.prototype本身也是一个对象,但它没有原型。
null 表示“无”,是原型链的终点。Object.prototype 还没有,就返回 undefined。