继承

什么是原型链

ECMAScript中,每个由构造器创建的对象都拥有一个指向构造器prototype属性值的隐式引用,这个引用称为原型(prototype)。

每个原型也可以拥有指向自己原型的隐式引用(即该原型的原型),如此下去,就是所谓的原型链(prototype chain),在具体的语言实现中,每个对象都有一个__proto__属性来实现对原型的隐式引用。

理解了原型链,便可以实现继承。ECMAScript规定,当要给某个对象的属性赋值时,解释器会查找该对象原型链中第一个含有该属性的对象(原型本身就是一个对象,那么原型链即为一组对象的链。对象的原型链中的第一个对象是该对象本身)。如果要获取某个对象属性的值,解释器会返回该对象原型链中首先具有该属性的对象属性值。如图:

原型链中的属性隐藏机制

图中,object1、prototype1、prototype2构成了对象object1的原型链。因为在object1中已经找到了prototype4属性,所以prototype1的prototype4属性被隐藏。同理,在prototype1中找到了prototype3属性,所以prototype2中的prototype3属性也被隐藏。

利用原型链实现继承
//声明Animal对象构造器
function Animal () {};
//将Animal的prototype属性指向一个对象;
//亦可以理解为指定Animal对象的原型
Animal.prototype={
    name:"mengmeng",
    weight:200,
    eat:function(){
        alert("动物");
    }
}
//声明Mammal对象构造器
function Mammal () {
    this.name = "哺乳动物";
}
//指定Mammal对象的原型为一个Animal对象。
//实际上此处便是在创建Mammal对象和Animal对象之间的原型链
Mammal.prototype = new Animal();
//声明Horse对象构造器
function Horse (height,weight) {
    this.name = "horse";
    this.height = height;
    this.weight = weight;
}
//将Horse对象的原型指定为一个Mammal对象,继续构建Horse与Mammal之间的原型链
Horse.prototype = new Mammal();
//重新指定eat方法,此方法将覆盖从Animal原型继承来的eat方法
Horse.prototype.eat=function () {
    alert("马");
}
var horse = new Horse(100,300);
horse.eat();//
alert(horse.__proto__ == Horse.prototype);//true
alert(horse.prototype.__proto__ == Mammal.prototype);//true
alert(Mammal.prototype.__proto__ == Animal.prototype);//true

参考文章:http://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/

原文地址:https://www.cnblogs.com/dragonwave/p/4740015.html