在JavaScript中,每个实例对象( object )都有一个私有属性(称之为 _ proto _ )指向它的构造函数的原型对象(prototype )。该原型对象也有一个自己的原型对象( _ proto _ ) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。
定义一个构造函数:
function Cat(name){
this.name = name;
this.color = "white";
}
生成一个Cat实例
var Cat1 = new Cat("mimi")
现在构造函数Cat()就是对象Cat1的原型,Cat()里的this关键字就是指Cat1这个对象。现在Cat1这个对象有自己的属性,跟Cat()已经再没有联系了,每个new出来的实例都有自己的属性和方法,更改其中一个不会影响其他的实例。
var Cat2 = new Cat("fanfan")
var Cat3 = new Cat("Vision")
Cat3.color = "black"
console.log(Cat2.color) //"white"
console.log(Cat3.color) //"black"
这样每个实例中都有一个color属性,会浪费内存资源。所以JS之父就决定给每个构造函数设一个prototype属性,prototype属性指向原型对象。原型对象里面存放着所有实例对象的公有属性和方法。所以实例对象的属性和方法一般分为两种:一种是自身的,一种是引用自prototype的。js里完全依靠"原型链"(prototype chain)模式来实现继承。
继承实现方式:
为了实现继承,proto会指向上一层的原型对象,而上一层的结构依然类似,那么就利用proto一直指向Object的原型对象上!Object.prototype.__ proto __ = null;表示到达最顶端。如此形成了原型链继承。
图解:
参考链接:
https://www.jianshu.com/p/f30fa27999e3
http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html