JavaScript中的继承

 一般的OO(Object-Oriented)语言都支持两种继承方式:接口继承和实现继承。ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的。

1.原型链

简单的来说就是实例的原型(prototype)指向另一个实例的原型,从而产生继承关系,共享原型的属性和方法。

Notes:1. 所有函数的默认原型都是Object的实例,从而都会继承Object的属性和方法,也是继承toString()、valueOf()默认方法更本原因。

     2.确定原型和实例关系的方法:instanceof()、isPrototypeOf()。

          3.给原型添加方法的代码一定要放在替换原型的语句之后(我感觉是逻辑顺序问题)。

缺点:1.共享问题,给实例属性都一样

      2.在创建子类型的实例时,不能向超类型的构造函数传递参数(不是很理解)

2.借用构造函数

在子类型构造函数的内部调用超类型构造函数,比如使用apply()和call()的方法。

function SuperType(){
    this.colors = {"red", "blue", "green"}
}

function SubType() {
    //继承了SuperType
    SuperType.call(this);


//子类型构造函数可以向超类型构造函数传递参数

function SuperType(name){
    this.name = name;
}

function SubType() {
    //继承了SuperType,同时还传递了参数
    SuperType.call(this, "Nicholas");

    //实例属性
    this.age = 29;
}

 

也就是SubType拥有了属于自己的和SuperType一样的属性,修改实例中的这个属性不会影响的其他的实例,因为并不会影响原型的属性,只是因为覆盖效果产生了不同。

3.原型式继承

function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
}
var person = {
     name :
     friends :
}
var anotherPerson= =object(person);
//相当于创建了一个person的副本

4.寄生式继承

通过封装函数的方法,不仅可以继承原对象,还可以拥有自己的属性和方法

function createAnother(original){
    var clone = object(original);        //通过调用函数创建新对象
    clone.sayHi = function(){           //以某种方式来增强对象
        alert("hi");
    }
    return clone;                            //返回这个对象
}    

5.寄生组合式继承

 组合继承的例子,会调用超类型构造函数两次

function SuperType(name){
    this.name = name;
    this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function() {
    alert(this.name);
}
function SubType(name,age) {
    SuperTpye.call(this,name);              //第二次调用SuperType()
    this.age = age;
}

SubType.prototype = new SuperType();       //第一次调用SuperType()
SubType.prototype .constructor = SubType;
SubType.prototype.sayAge = function(){
    alert(this.name); 
};

 

 寄生组合式基本模式(最理想的继承模式)

function inheritPrototype(subType, superType) {
    var prototype = object(superType.prototype); //创建对象
    prototype.construcor = subType;                 //增强对象
    subType.prototype = prototype;                 //指定对象
}
function SuperType(name){
    this.name = name;
    this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function() {
    alert(this.name);
}
function SubType(name,age) {
    SuperTpye.call(this,name);              
    this.age = age;
}

inheritPrototype(subType,SuperType);             //避免了两次调用
SubType.prototype.sayAge = function(){
    alert(this.age);
}

 

posted @ 2016-10-30 00:04  Hiker`  阅读(181)  评论(0)    收藏  举报