.原型
每个函数对象都会有个prototype属性,它指向了该构建函数实例化的原型。使用该构建函数实例化对象时,会继承该原型中的属性及方法。所有的对象都有__proto__属性,它指向了创建它的构建函数的原型。
- prototype是一个类的属性,所有类对象在实例化的时候将会拥有prototype中的属性和方法,
- 一个对象的__proto__属性,指向这个对象所在的类的prototype属性
.原型链
所谓原型链也是指JS中的一个继承和反向查找的机制,函数对象可以通过prototype属性找到函数原型,普通实例对象可以通过__proto__属性找到构建其函数的原型。
JavaScript的这个查找的机制,被运用在面向对象的继承中,被称作prototype继承
- 每个构造函数(constructor)都有一个原型对象(prototype)
- 对象的__proto__属性,指向类的原型对象prototype
- JavaScript使用prototype链实现继承机制
__proto__ 属性: 它是对象所独有的,__proto__属性都是由一个对象指向一个对象,即指向它们的原型对象(也可以理解为父对象)
prototype 属性:使您有能力向对象添加属性和方法。
constructor 属性:每个实例对象都从原型中继承了一个constructor属性,该属性指向了用于构造此实例对象的构造函数。
(图片来源其他)
总结:
- ①__proto__和constructor属性是对象所独有的;② prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__和constructor属性。
- __proto__属性的作用:是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点null,再往上找就相当于在null上取值,会报错。通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链。
- prototype属性的作用:是让该函数所实例化的对象们都可以找到公用的属性和方法,即f1.__proto__ === Foo.prototype。
- constructor属性:是指向该对象的构造函数,所有函数(此时看成对象了)最终的构造函数都指向Function。