原型和原型链
1. 原型
__proto__,prototype这两个东西是什么?两者之间的联系?
-
prototype是函数才有的属性。每个函数在创建时就会有一个prototype属性,名为 原型对象 。 -
__proto__是实例对象的内部指针,指向构造函数原型。 -
联系:某实例对象的
__proto__属性值等于它的构造函数的显式原型的prototype属性值。
例子说明:
var a = function Name() {} //构造函数
let aa = new a() // 实例
console.log(a.prototype);
console.log(a.__proto__);
console.log(aa.prototype);
console.log(aa.__proto__);
console.log(a.prototype === aa.__proto__);
在浏览器中打印结果如下:
2. 原型链
-
原型链,就是对象想使用某个属性时,首先从自己的构造函数中找,没有就继续从构造函数的原型对象(也就是
prototype)中找,没有,继续,直到到原型的尽头null图片说明如下:
- 构造函数的prototype属性的constructor属性是自己(函数)
console.log(a.prototype.constructor);
放上阮一峰老师关于继承机制的说法:
- prototype属性包含一个对象(以下简称"prototype对象"),所有实例对象需要共享的属性和方法,都放在这个对象(prototype)里面,修改prototype对象的话会影响所有的实例对象。
- 那些不需要共享的属性和方法,就放在构造函数(函数体)里面,修改prototype对象的话不会影响其他实例对象。
- 实例对象一旦创建,将自动引用prototype对象的属性和方法。也就是说,实例对象的属性和方法,分成两种,一种是本地的,另一种是引用的。