JavaScript原型

JavaScript原型及原型链

前言

  1. prototype(原型):函数中的一个属性,指向该构造函数的原型对象(原型对象用于实例共享属性和方法)
  2. __proto__:对象中的一个属性,指向构造函数的原型对象,在ECMA-262第五版中被称为[[prototype]],且没有标准的方式能访问到,__proto__为浏览器支持属性;
  3. constructor:原型对象中的一个属性,指向该原型对象的构造函数

正文

  1. 在JavaScript中,当创建一个函数时,会给这个函数创建一个属性prototype,用于指向该函数的原型对象。而原型对象拥有一个constructor属性,指向该原型对象所在函数。借用《JavaScript高级程序设计》里面的一张图。

JavaScript原型_第1张图片
上图中,Person.prototype指向Person的原型对象,而Person.prototype.constructor又指向该函数Person。而Person的实例person1和person2的属性__proto__都指向着Person.prototype,共享Person原型对象上面的属性和方法。

  1. __proto__指向函数的原型对象。person1的__proto__指向Person的原型对象,而Person的原型对象的__proto__又指向着它的上一级Object的原型对象,而Object的原型对象指向着最顶层null。
    继续说Person的例子,例如当调用实例person1的toString()方法时,会先在自身查找,发现没有这个方法,就顺着__proto__的指向,找到了Person.prototype原型对象,也没找到,继续顺着__proto__寻找toString(),最后再Object的原型对象上找到,并调用。如果在Object的原型对象上也没找到,就到了最顶层null,最终返回undefined。这就构成了原型链
    JavaScript原型_第2张图片
  2. 接着说constructor,该属性存在于对象中,指向自身的构造函数。例如实例person1.constructor指向构造函数Person,Person.constructor指向Function。而Function.constructor比较特殊,指向Function本身。JavaScript原型_第3张图片

总结

  1. JavaScript中函数的prototype,指向函数的原型对象;
  2. 对象的constructor指向该对象对应的构造函数;
  3. __proto__指向函数的原型对象,原型对象可以共享属性和方法,用来实现原型链。

你可能感兴趣的:(JS)