组合继承与寄生组合式继承

组合继承  

  将原型链和借用构造函数的技术组合到一块。

  使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。

  超类的属性被继承了两次,一次是在子类的构造函数中,使得子类实例拥有各自的属性;一次是在子类的原型中,使得子类拥有相同的属性。

 1 function SuperType(name){
 2             this.name = name;
 3             this.colors = ["red","blue","green"];
 4         }
 5         SuperType.prototype.sayName = function(){
 6             alert(this.name);
 7         };
 8
 9         function SubType(name,age){
10             //继承属性
11             SuperType.call(this,name);//构造函数继承方法
12             this.age = age;
13         }
14         //继承属性和方法
15         SubType.prototype = new SuperType();//原型链继承
16         SubType.prototype.sayAge = function(){
17             alert(this.age);
18         };
19
20         var instance1 = new SubType("Nicholas",29);
21         instance1.colors.push("black");
22         alert(instance1.colors);//red,blue,green,black
23         instance1.sayName();
24         instance1.sayAge();
25
26         var instance2 = new SubType("Greg",27);
27         alert(instance2.colors);//red,blue,green
28         instance2.sayName();//Greg
29         instance2.sayAge();//27          

寄生组合式继承

  通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。

  本质上是,使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型。

 1         function object(o){//原型式继承,创建临时构造函数,只继承原型
 2             function F(){}
 3             F.prototype = o;
 4             return new F();
 5         }
 6
 7         function inheritPrototype(subType,superType){//寄生式继承,创建一个仅用于封装继承过程的函数,在函数内部以某种方式来增强对象,最后返回对象
 8             var prototype = object(superType.prototype);//创建对象
 9             prototype.constructor = subType;//增强对象
10             subType.prototype = prototype;//指定对象,
11             //subType的原型为prototype,prototype是F的一个实例,而不再是superType的实例,没有superType的属性,prototype的原型为superType.prototype,
12             //subType的原型指向F,F的原型指向superType的原型,F的构造函数指向subType,避免了重复生成SuperType的构造函数属性,
13             //使subType的构造函数继承到superType的属性,subType的原型继承到superType的原型
14         }
15
16         function SuperType(name){
17             this.name = name;
18             this.colors = ["red","blue","green"];
19         }
20         SuperType.prototype.sayName = function(){
21             alert(this.name);
22         };
23
24         function SubType(name,age){
25             SuperType.call(this,name);
26             this.age = age;
27         }
28         inheritPrototype(SubType,SuperType);
29         SubType.prototype.sayAge() = function(){
30             alert(this.age);
31         }    

  只调用一次SuperType构造函数,避免了在SubType prototype上面创建不必要的多余的属性。与此同时,原型链还能保持不变。

时间: 2024-11-08 15:18:44

组合继承与寄生组合式继承的相关文章

JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承

说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象JS基础讲解,工厂模式.构造函数模式.原型模式.混合模式.动态原型模式>,接下来讲一般通过那些方法完成JavaScript的继承. 原型链 JavaScript中实现继承最简单的方式就是使用原型链,将子类型的原型指向父类型的实例即可,即“子类型.prototype = new 父类型();”,实现方法如下

组合继承 和 原型式继承、寄生组合式继承

//以下代码均摘自 Nicholas C.Zakas<Professional JavaScript for Web Developers> //组合继承实例代码: function SuperType(name) {     this.name = name;     this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function() 

JavaScript中的继承之寄生组合式继承

先说说组合继承.最常用的继承方式组合继承,其最大的问题是无论在什么情况下,都会调用两次超类型的构造函数:一次是在创建子类原型的时候,另一次是在子类型构造函数内部. 组合继承是通过原型继承方法和原型属性,构造函数继承实例属性.但子类通过原型也继承了超类型的全部实例属性(方法暂且不说),即超类的实例属性成为子类的原型属性,所以不得不在调用子类构造函数时重写这些属性.也就是说在子类的原型对象上继承来自超类的实例属性完全是多余的. 看一个组合继承的例子. function SuperType(name)

JavaScript之原型式继承&amp;寄生式继承和寄生组合式继承以及优缺点

一.原型式继承 1.这种方法并没有使用严格意义上的构造函数,借助原型可以基于已有的对象创建新的对象 function object(o) { function F() {} F.prototype = o; return new F(); } // 在object()函数内部,先创建一个临时性的构造函数,然后将传入的对象作为这个构造函数原型,最后返回了这个临时类型的一个新实例. // object()本质上对其中传入的对象进行了一次浅复制 // 看如下的例子: var person = { na

[js高手之路]寄生组合式继承的优势

在之前javascript面向对象系列的文章里面,我们已经探讨了组合继承和寄生继承,回顾下组合继承: 1 function Person( uName ){ 2 this.skills = [ 'php', 'javascript' ]; 3 this.userName = uName; 4 } 5 Person.prototype.showUserName = function(){ 6 return this.userName; 7 } 8 function Teacher ( uName

JS继承 -- 寄生式继承 &amp; 寄生组合式继承

5.寄生式继承 与寄生构造函数和工厂模式类似,创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后返回对象. function createAnother(original){ var clone = Object.create(original); //通过调用函数创建一个新对象 clone.sayHi = function(){ //以某种方式来增强这个对象 alert("Hi"); }; return clone; //返回这个对象 } var person

javascript寄生组合式继承

下面是javascript寄生组合式继承源代码,选自这里.讲解请见我所加注释: function creatObject(o){//该函数是为了创建原型链对象所用,传入值o为一个function F(){}//新建函数 F.prototype = o;//设置该函数的原型属性为传入对象 return new F();//调用该函数后返回链式对象F.prototype=o; } function inheritPrototype(subType, superType){//用于设置对象属性 var

[javascript高手之路]寄生组合式继承的优势

在之前javascript面向对象系列的文章里面,我们已经探讨了组合继承和寄生继承,回顾下组合继承: function Person( uName ){             this.skills = [ 'php', 'javascript' ];             this.userName = uName;         }         Person.prototype.showUserName = function(){             return this.u

javaScript设计模式之面向对象编程(object-oriented programming,OOP)--寄生组合式继承

组合式继承:将类式继承同构造函数继承组合使用,但是存在一个问题,子类不是父类的实例,而子类的原型式父类的实例,所以才有了寄生组合式继承. 意思就是说,寄生就是寄生式继承,寄生式继承就是依托于原型继承,原型继承又与类式继承差不多,所以另外一种继承模式应该是构造函数继承.当然子类不是父类的实例的问题是由于类式继承引起的. 说道这,我不得不说一下,道格拉斯大哥对寄生式继承的改造 function inheritPrototype(subClass,superClass){ //复制一份父类的原型副本保