javascript最常用的继承模式-寄生组合式继承——引用类型最理想的继承范式
2012-03-22 17:25
232 查看
很多人认为组合继承是js最常用的继承模式;不过它也有自己的不足。组合继承最大的问题就是无论什么情况下,都会调用两次超类型构造函数:
一次是在创建子类型原型的时候
另一次是在子类型构造函数内部。
这样,子类型最终会包含超类型对象的全部实例属性,但我们不得不在调用子类型构造函数时重写这些属性。
第一次调用SuperType构造函数时,SubType。prototype会得到两个属性:name和color,他们都是SuperType的实例属性,只不过现在位于SubType的原型中。
当调用SuperType构造函数时,又会调用一次SuperType构造函数,这一次又在新对象上创建了实例属性name和color。
于是,这两个属性就屏蔽了原型中的两个同名属性。
这两个属性,一组在实例上,一组在SubType原型中。解决这个问题的方法-寄生组合式继承。
所谓寄生组合式继承,即:通过借用构造函数来继承属性,通过原型链的混成形式来继承方法
寄生组合式继承
inhertitPrototype(subType,SuperType)函数实现了寄生组合式继承的最简单的形式。这个函数接收两个参数:子类型构造函数和超类型构造函数。
在函数内部,第一步:创建超类型原型的一个副本。
第二步:为创建的副本添加constructor属性,从而弥补因重写原型而失去的默认的constructor属性。
第三步:将新创建的对象赋值给子类型的原型。
这样,我们就可以调用inheritPrototype()函数,去替换前面例子中为子类型原型赋值的语句了。
一次是在创建子类型原型的时候
另一次是在子类型构造函数内部。
这样,子类型最终会包含超类型对象的全部实例属性,但我们不得不在调用子类型构造函数时重写这些属性。
function SuperType(name){ this.name=name; this.color=["red","blue","green"]; } SuperType.prototype.sayName=function(){ alert(this.name); }; function SubType(name,age){ SuperType.call(this,name); //第二次调用SuperType() this.age=age; } SubType.prototype=new SuperType(); // 第一次调用SuperType() SubType.prototype.sayAge=function(){ alert(this.age); }
第一次调用SuperType构造函数时,SubType。prototype会得到两个属性:name和color,他们都是SuperType的实例属性,只不过现在位于SubType的原型中。
当调用SuperType构造函数时,又会调用一次SuperType构造函数,这一次又在新对象上创建了实例属性name和color。
于是,这两个属性就屏蔽了原型中的两个同名属性。
这两个属性,一组在实例上,一组在SubType原型中。解决这个问题的方法-寄生组合式继承。
所谓寄生组合式继承,即:通过借用构造函数来继承属性,通过原型链的混成形式来继承方法
寄生组合式继承
function inheritPrototype(subType,superType){ var prototype=object(superType.prototype);//创建对象 prototype.constructor=subType;//增强对象 subType.prototype=prototype;//指定对象 } function SuperType(name){ this.name=name; this.color=["red","blue","greed"]; } SuperType.prototype.sayName=function(){ alert(this.name); } function SubType(name,age){ SuperType.call(this,name); this.age=age; } inheritPrototype(SubType,SuperType); SubType.prototype.sayAge=function(){ alert(this.age); };
inhertitPrototype(subType,SuperType)函数实现了寄生组合式继承的最简单的形式。这个函数接收两个参数:子类型构造函数和超类型构造函数。
在函数内部,第一步:创建超类型原型的一个副本。
第二步:为创建的副本添加constructor属性,从而弥补因重写原型而失去的默认的constructor属性。
第三步:将新创建的对象赋值给子类型的原型。
这样,我们就可以调用inheritPrototype()函数,去替换前面例子中为子类型原型赋值的语句了。
相关文章推荐
- JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承
- JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
- JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
- JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
- JS学习笔记——JavaScript继承的6种方法(原型链、借用构造函数、组合、原型式、寄生式、寄生组合式)
- 【代码整理】JavaScript的寄生组合式继承
- javascript中寄生组合式继承
- javascript中最常用的继承模式 组合继承
- JavaScript之面向对象学习七(动态原型模式、寄生构造函数模式、稳妥构造函数模式创建自定义类型)
- JavaScript中各种引用类型的常用操作方法小结
- js最理想的继承——寄生组合式继承
- 寄生组合式继承——《Javascript 高级程序设计》6.3.6
- 【JavaScript学习】面向对象的程序设计(7):寄生式继承和寄生组合式继承
- JavaScript中寄生组合式继承的理解
- JavaScript寄生组合式继承实例详解
- javascript 寄生组合式继承
- JavaScript寄生组合式继承分析
- JavaScript-------寄生组合式继承
- JavaScript中各种引用类型的常用操作方法小结