原型与原型链

   在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;表示到达最顶端。如此形成了原型链继承。
图解:


原型链关系图.png

参考链接:
https://www.jianshu.com/p/f30fa27999e3
http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容