<!doctype html> <html> <head> <meta charset="utf-8"> <title>寄生组合式继承</title> <script type="text/javascript"> /* 组合继承是JavaScript 最常用的继承模式; 不过,它也有自己的不足。组合继承最大的问题就是无论什么情况下,都会调用两次超类型构造函数:一次是在创建子类型原型的时候,另一次是在子类型构造函数内部。没错,子类型最终会包含超类型对象的全部实例属性,但我们不得不在调用子类型构造函数时重写这些属性。 */ function object(o) { function F() {} F.prototype = o; return new F(); } function inheritPrototype(subType, superType) { var prototype = object(superType.prototype); //创建对象 prototype.constructor = 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) { //当调用SubType 构造函数时,又会调用一次SuperType构造函数,这一次又在新对象上创建了实例属性name和colors。于是,这两个属性就屏蔽了原型中的两个同名属性 SuperType.call(this, name); //第二次调用SuperType() this.age = age; } SubType.prototype = new SuperType(); //第一次调用SuperType() SubType.prototype 会得到两个属性:name 和colors;它们都是SuperType 的实例属性,只不过现在位于SubType 的原型中。 SubType.prototype.sayAge = function() { alert(this.age); }; var instance1 = new SubType("flyer", 29); instance1.colors.push("black"); alert(instance1.colors); //"red,blue,green,black" instance1.sayName(); //"flyer"; instance1.sayAge(); //29 var instance2 = new SubType("bing", 27); alert(instance2.colors); //"red,blue,green" instance2.sayName(); //"bing"; instance2.sayAge(); //27 </script> </head> <body> </body> </html>
改进:
<!doctype html> <html> <head> <meta charset="utf-8"> <title>寄生组合式继承</title> <script type="text/javascript"> /* 这个例子的高效率体现在它只调用了一次SuperType 构造函数,并且因此避免了在SubType. prototype 上面创建不必要的、多余的属性。与此同时,原型链还能保持不变;因此,还能够正常使用 instanceof 和isPrototypeOf()。开发人员普遍认为寄生组合式继承是引用类型最理想的继承范式。 */ function object(o) { function F() {} F.prototype = o; return new F(); } function inheritPrototype(subType, superType) { var prototype = object(superType.prototype); //创建对象 prototype.constructor = 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) { SuperType.call(this, name); this.age = age; } //SubType.prototype = new SuperType(); //第一次调用SuperType() SubType.prototype inheritPrototype(SubType, SuperType); SubType.prototype.sayAge = function() { alert(this.age); }; var instance1 = new SubType("flyer", 29); instance1.colors.push("black"); alert(instance1.colors); //"red,blue,green,black" instance1.sayName(); //"flyer"; instance1.sayAge(); //29 var instance2 = new SubType("bing", 27); alert(instance2.colors); //"red,blue,green" instance2.sayName(); //"bing"; instance2.sayAge(); //27 </script> </head> <body> </body> </html>
相关推荐
本文主要探讨两种继承模式:寄生式继承和寄生组合式继承。 首先,寄生式继承是一种不直接修改原对象,而是通过创建其副本并在副本上进行增强的方法。这种方式避免了直接操作原对象可能导致的问题。例如,我们有一个...
本文实例讲述了JavaScript寄生组合式继承。分享给大家供大家参考,具体如下: 其实《JavaScript高级程序设计》这本书中已经有完整代码了,只要把代码读懂就知道这个继承是怎么回事。 首先,在js中,给对象定义属性有...
在JavaScript中实现继承的方法有很多种,其中寄生组合式继承被认为是最高效和优雅的一种方式。 ### 寄生组合式继承的原理 寄生组合式继承的原理是结合了寄生式继承和组合式继承的优点。组合式继承(也称为伪经典...
寄生组合式继承是JavaScript中实现继承的一种高效策略,它结合了组合继承和寄生继承的优点,有效地解决了传统组合继承的一些问题。在此模式下,我们可以避免父类构造函数被不必要的多次调用,同时还能保留父类原型上...
本文主要探讨五种经典的继承方式:原型式继承、原型链式继承、借用构造函数(类式继承)、组合继承以及寄生组合式继承。 1. **原型式继承**: 原型式继承是通过创建一个新对象,使其原型指向另一个对象,从而实现...
本文将探讨JavaScript中对象的创建方式以及六种常见的继承模式,包括原型链继承、借用构造函数继承、组合继承、原型式继承、寄生式继承以及寄生组合式继承。 首先,让我们从对象的创建开始谈起。在JavaScript中创建...
在 JavaScript 中,继承主要通过原型链(prototype chain)、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承等方法实现。以下是对这些继承方式的详细解释: 1. **原型链继承**:这是 JavaScript ...
这里我们将深入探讨几种主要的继承方式:原型式继承、寄生式继承和寄生组合式继承。 ### 原型式继承 在JavaScript中,对象有一个名为`__proto__`的内部属性,指向创建该对象的构造函数的原型。原型式继承利用了这...
寄生组合式继承是目前最理想的继承方式,它避免了组合继承中调用两次构造函数的问题。这种继承方法只调用一次超类型构造函数,并且因此只创建一次超类型原型。 优点: - 最有效的一种继承方式,只调用一次超类型...
本文将深入探讨JavaScript继承的六大模式:原型链、借用构造函数、组合继承、原型式继承、寄生式继承以及寄生组合式继承。 1. **原型链** 原型链是JavaScript中最基础的继承方式,通过原型对象的引用实现。每个...
除了寄生式组合继承之外,还有一种叫做**寄生式继承**的方式。它主要是通过一个函数包装一个对象,然后返回这个函数的调用结果,从而创建一个新的对象。这种方式可以给对象添加额外的功能,而不改变其原有的类型。 ...
使用js实现继承的七种方式,详细讲解了js中的原型链继承,构造函数继承,组合继承(经典继承),原型式继承,寄生式继承,寄生组合式继承,以及ES6中的继承,描述原理以及实现和要点概述等。
- 寄生组合式继承解决了构造函数继承的缺点,通过在子类构造函数内部调用父类构造函数,并利用工厂函数创建实例,避免了属性的重复。 6. 寄生继承: 主要用于改善对象的创建,通过一个辅助函数创建原始对象的副本...
5. **寄生组合式继承**:结合了寄生式继承和组合继承的优点,是JavaScript中推荐的继承方式,可以在`Javascript面向对象编程(三):非构造函数的继承.docx`中找到更详细的解释。 例如,使用寄生组合式继承: ```...