.原型

每个函数对象都会有个prototype属性,它指向了该构建函数实例化的原型。使用该构建函数实例化对象时,会继承该原型中的属性及方法。所有的对象都有__proto__属性,它指向了创建它的构建函数的原型。

  1. prototype是一个类的属性,所有类对象在实例化的时候将会拥有prototype中的属性和方法,
  2. 一个对象的__proto__属性,指向这个对象所在的类的prototype属性

 

.原型链

所谓原型链也是指JS中的一个继承和反向查找的机制,函数对象可以通过prototype属性找到函数原型,普通实例对象可以通过__proto__属性找到构建其函数的原型。

JavaScript的这个查找的机制,被运用在面向对象的继承中,被称作prototype继承

  1. 每个构造函数(constructor)都有一个原型对象(prototype)
  2. 对象的__proto__属性,指向类的原型对象prototype
  3. JavaScript使用prototype链实现继承机制

__proto__ 属性: 它是对象所独有的,__proto__属性都是由一个对象指向一个对象,即指向它们的原型对象(也可以理解为父对象)

prototype 属性:使您有能力向对象添加属性和方法。

constructor 属性:每个实例对象都从原型中继承了一个constructor属性,该属性指向了用于构造此实例对象的构造函数。

Javascript 原型以及原型链

(图片来源其他)

 

总结:

  1. ①__proto__和constructor属性是对象所独有的;② prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__和constructor属性。
  2. __proto__属性的作用:是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点null,再往上找就相当于在null上取值,会报错。通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链
  3. prototype属性的作用:是让该函数所实例化的对象们都可以找到公用的属性和方法,即f1.__proto__ === Foo.prototype。
  4. constructor属性:是指向该对象的构造函数,所有函数(此时看成对象了)最终的构造函数都指向Function。

相关文章: