原型 & 原型链


原型

要先建立构造函数,构造函数的 prototype 属性会自动指向原型对象。
在创建实例后,可以修改 prototype 对象中的属性,但不可以重写整个原型(开始没有定义,再实例创建后给 prototype 添加属性

构造函数、原型和实例的关系

  • 每个 构造函数 都有一个原型对象(原型 prototype)
  • 原型有一个 constructor 属性指回构造函数
  • 实例有一个内部指针 [[Prototype]] 指向原型
  • 原型上的所有属性在实例间共享
  • 实例上添加同名属性会遮蔽原型上的属性

构造函数-原型-实例关系图

如图,展示了 Person 构造函数、Person 的原型对象和 Person 现有的两个实例之间的关系。Person.prototype指向原型对象Person.prototype.constructor指回构造函数
原型对象中包含constructor属性和其他后来添加的属性。Person 的两个实例 person1 和 person2 都只有一个内部属性指回Person.prototype,而且两者与构造函数没有直接联系。

实例的属性和方法
虽然两个实例都没有属性和方法,但是它们person1.sayName()可以正常调用,这是由于对象属性查找机制,通过对象访问属性时,会按照这个属性的名称开始搜索,先搜索对象实例本身,如果有则返回对应的值,如果没有找到这个属性,则搜索会沿着指针进入原型对象,在原型对象上找到属性后,再返回对应的值。

原型链

基本构想是:实例 指向 原型,而 原型 是另一个 原型实例 ,意味着这个原型的本身有一个内部指针指向另一个原型(继承的原型),相应的另一个原型也有一个指针指向另一个 构造函数(它自己的),这样实例原型之间就构造了一条 原型链
原型链 扩展了原型搜索机制,读取实例上的属性时,先在实例上搜索,再搜索它继承的原型,再通过原型链 继承 后,搜索就可以继承向上,顺着 原型链 向上搜索其他的原型。
原型链

默认情况下,所有引用类型都继承Object,任何函数的默认原型都是一个Object的实例。
这意味着这个实例有一个内部指针指向这个Object.prototype,所以原型链的顶端还有Object, Object.prototypenull


文章作者: .Paly
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 .Paly !
  目录