摘要:我所理解的原型及原型链,先放张图
原型规则:
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
是内置对象,一开始就存在