本文实例讲述了JavaScript寄生组合式继承。分享给大家供大家参考,具体如下:寄生组合式
本文实例讲述了JavaScript寄生组合式继承。分享给大家供大家参考,具体如下:
寄生组合式继承
寄生组合式继承,就是通过伪造对象来继承属性,通过原型链的混成形式来继承方法。
这种技术的基本思路是:不必为了指定子类型的原型而调用超类型的构造函数,因为我们所需要的只是超类型原型的一个副本而已(这一点正是组合继承的问题,并且正是JavaScript这种原型式语言的强大之处,直接copy对象-原型对象)。本质上,就是使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型。
function inheritPrototype(subType, superType){
var prototype = Object.create(superType.prototype); //创建超类型原型副本
prototype.constructor = subType; //修改原型副本的不同属性
subType.prototype = prototype; //指定原型
}
function SuperType(name){
this.name = name;
this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function(){
console.log(this.name);
}
function SubType(name, age){
//继承属性
SuperType.call(this, name);
//实例属性
this.age = age;
}
//继承方法
inheritPrototype(SubType, SuperType);
SubType.prototype.sayAge = function(){
console.log(this.age);
};
var instance1 = new SubType("Nicholas", 29);
instance1.colors.push("black");
console.log(instance1.colors); //"red, blue, green, black"
instance1.sayName(); //"Nicholas"
instance1.sayAge(); //29
这里使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码,可得如下运行结果:
这个是寄生组合式继承的最简单形式。这个函数接收两个参数:
1. 子类型构造函数 2. 超类型构造函数
在函数内部,寄生组合式继承最简形式分为3个步骤:
1. 创建超类型原型副本; 2. 为创建的副本指定constructor属性,从而弥补因为重写SubType原型而失去的默认的constructor属性,这个原型副本的constructor属性变化:SuperType –> SubType; 3. 将该完善好的副本赋值给子类型的原型。
寄生组合式继承的图解如下:
寄生组合式继承的高效率体现在它只调用了一次SuperType构造函数,并且因此避免了在SubType.prototype
上面创建不必要的,多余的属性。与此同时,原型链还能保持不变。