摘要:我所理解的原型及原型链,先放张图
原型规则:
1.所有的引用类型都具有对象特性,即可自由扩展属性
2.所有的函数都有一个 prototype 属性,该属性指向由该函数创建的实例的原型
3.所有的引用类型都有一个 __proto__ 属性,该属性指向它的构造函数的 prototype 属性,即它的原型,但要注意:__proto__ 属性只能在学习或调试的环境下使用。在 ES5 下可以使用 Object.getPrototypeOf 获得对象原型,或者isPrototypeOf 判断对象原型
4.每个原型都有一个 constructor 属性指向关联的构造函数
5.如果对象本身没有某个属性,就会去它的原型对象中查询。如果还没有,继续到原型对象的原型中查询,沿着原型链一级一级向上查询直到 null
1 | // 构造函数 Foo |
构造函数 Foo、实例原型 Foo.prototype 与实例 f1 三者之间的关系
Foo.prototype 也是个对象,它由构造函数 Object 实例化生成的,即 Foo.prototype 的原型 Foo.prototype.__proto__ 指向了 Object.prototype
1 | Object.prototype.isPrototypeOf(Foo.prototype); // true |
结合上一张图,添加上构造函数 Object、原型 Object.prototype 及实例:
不要忘记函数也是个对象,是由 Function 构造器生成的,那么函数的原型就是 Function.prototype 啦!同时,Function.prototype 也是个对象,它的原型又指向了 Object.prototype。Object.prototype 的原型指向 null
1 | Object.prototype.isPrototypeOf(Function.prototype); // true |
更新关系图:
注意: Function.__proto__ 是指向 Function.prototype 的,但这并不表示 Function 构造器创建了自己—— Function 是内置对象,一开始就存在