理解JavaScript 中的原型模式

原型对象的创建

  • 我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向函数的原型对象。

原型对象

  • 所有的原型对象都会自动获得一个constructor(构造函数)属性,这个属性指向prototype属性所在函数的。

  • 原型对象还有很多从Object继承来的属性和方法。

  • 当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象--[[prototype]]。

[[prototype]]

这个是一个指针,这指针指向原型对象。 脚本没有标准的方式访问这个[[prototype]],但FireFox Safari Chrome 都支持一个属性称为proto (称为“隐式原型”)

连接存在于实例和原型对象之间,而不是实例与构造函数。

Person–> Person.prototype <–person1

  • 上图展示了Person构造函数、Person的原型属性以及现有的两个实例之间的关系。

  • 构造函数的prototype属性指向原型对象,原型对象的constructor属性又指回了构造函数!

  • 原型对象除了包含constructor属性之外,还包括后来添加的其他属性。Person的每个实例都包含一个内部属性——“proto”,这个属性仅仅指向了

  • Person.prototype,即:Person.proto === Person.prototype;换句话说,它们与构造函数没有直接关系。

isPrototypeOf

判断某个实例和某个原型的对应关系。

Person.prototype.isPrototypeOf(person1);//true

它就是判断实例的[[prototype]]是否指向调用这个方法的对象。

Object.getPrototypeOf

ES5新方法,用来获取一个实例的原型。

Object.getPrototypeOf(person1)==Person.prototype;   // true

Object.getPrototypeOf(person1).name; // "Nicholas"

返回的原型,可以访问这个原型中的属性方法值。
我们在使用原型继承的时候会用到这个方法。

原型链

原理:每当代码读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。搜索首先从对象实例本身开始,如果在实例中找到了具有给定名字的属性,则返回该属性的值;如果没有找到,则继续搜索指针指向的原型对象,在原型对象中搜索给定名字的属性。如果搜索到了属性就停止。仍然搜索不到,就搜索这个原型对象的上一级的原型对象,直到Object.prototype,这个是所有对象的根原型对象,它的上一级是null。

文章参考

推荐阅读更多精彩内容