彻底搞清“原型与原型链”
prototype
每个 函数 都有一个
prototype
属性,属性指向的是构造函数的原型。原型: 每一个 Javascript 对象(除 null 外)在创建的时候就会与之关联另一个对象,这个对象就是原型。
__proto__
每一个 Javascript 对象(除了 null)都具有这个属性, 指向该对象的原型。
1 | function Person() { |
constructor
这个属性只存在于原型之上,指向相关联的构造函数。例如 Person === Person.prototype.constructor
。
实例与原型
当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止
原型与原型
原型也是一个对象,既然是对象,我们就可以用最原始的方式创建它。
1 | var obj = new Object(); |
原型对象就是通过 Object 构造函数生成的。
原型链
1 | Object.prototype.__proto__ === null // true |
null 表示“没有对象”,即该处不应该有值。
由相互关联的原型组成的链状结构就是原型链
综上汇集成一张图表示
补充
__proto__
是每个对象都有的属性,它指向对象的原型。绝大部分浏览器都支持这个非标准的方法,但是它并不存在与原型之中,调用它的效果如同 Object.getPrototypeOf(obj)
。