原型
每一个构造函数都有一个原型属性(prototype),这个属性保存了构造函数创建的一类实例对象共有的方法,然而每个实例化对象都有一个__proto__属性,这个属性指向了它构造函数的原型对象(prototype)。
例如下面代码,可以给原型对象添加方法:
// 定义一个Dog对象
function Dog(){ }
// 给原型对象添加方法
Dog.prototype.run=function(){
console.log('跑');
}
console.log(Dog.prototype);
// 通过new实例化对象
let d1=new Dog();
// 实例化对象的__proto__属性指向构造函数的原型(prototype)
console.log(Dog.prototype==d1.__proto__); // true
原型链
每个对象都有一个__proto__属性,这个属性指向了它构造函数的原型对象(prototype),原型对象也有一个__proto__属性,所以当我们使用对象的方法或者属性时,先在自身中找,找不到就去原型中找,原型也是一个对象,原型中找不到就去原型的原型中去找,直到找到Object.prototype为止,因为Object.prototype为null。