寄生组合继承

寄生组合式继承,是集寄生式继承和组合继承的有点与一身,主要是通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。

  先看一个例子:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

function inheritPrototype(SuperType, SubType){

    var prototype = Object.create(SuperType.prototype);

    prototype.constructor = SubType;

    SubType.prototype = prototype;

}

function SuperType(name){

    this.name = name;

    this.colors = ["red""blue""yellow"];

}

function SubType(name){

    SuperType.call(this, name);

}

inheritPrototype(SuperType, SubType);

var s1 = new SubType("niulina");

  这个代码中有一个Object.create(supertype)函数,这个函数是ECMAScript 6为了规范原型式继承而提出的一个方法,与下面这个方法是等价的:


1

2

3

4

5

function object(o){

    function f(){}

    f.prototype = o;

    return new f();

}

  这个方法做了什么工作呢?如下图所示:

  object(o)方法的工作就是:

  • 创建一个构造函数f
  • 使该构造函数的prototype指针指向参数
  • 创建f对象的一个实例,幷返回

  在该函数调用完以后,f的构造函数便会销毁,所以整个函数的工作就是让一个对象的__proto__指针指向参数。

  继续回到寄生组合式继承,第二行代码:


1

var prototype = Object.create(SuperType.prototype);

  使得新创建的prototype对象的__proto__指针指向SuperType的原型对象。再看第三四行:


1

2

prototype.constructor = SubType;

SubType.prototype = prototype;

  将这个prototype对象的construstor指针指向SubType的构造函数,幷将SubType的构造函数的prototype指针指向这个prototype对象,所以inheritPrototype的工作就是使SubType继承于SuperType(也就是SubType的原型对象的__proto__指针指向SuperType的原型对象),如下图所示。  

  

时间: 2024-08-06 20:08:45

寄生组合继承的相关文章

[js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理,由主板,电源,内存条,显卡, 机箱,显示器,外设等组成的 把一个成型的产品组成部件,分成一个个独立的部件,这种方式可以做出很多灵活的产品,这就是组合模式的优势 比如:家用台式机电脑,要求配置比较低, 这个时候只需要主板+电源+内存条+机箱+显示器+外设就可以了,不需要配置独立显卡 鸡腿堡+鸡翅+紫薯

JavaScript各种继承方式(六):寄生组合继承

一 原理 用寄生继承来改造组合继承. function Fruit(name){ this.name = name; } Fruit.prototype.eat = function(){ console.log('eat'); } function Mango(name,level){ Fruit.call(this,name); this.level = level; } function create(obj){ let instance = Object.create(obj); //

组合继承和寄生组合继承的区别

组合继承 核心思想:使用借用构造函数的技术实现实例属性的继承,使用原型链实现原型属性和方法的继承. function SuperType(name){ this.name = name; this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function(){ alert(this.name); }; function SubType(name, age

继承第一节(call继承、拷贝继承、寄生组合继承)

1.call 继承 类式(call)继承(一般类式继承是继承属性) 调用父类,通过call来改变this(把window改成子类)达到继承属性的目的. function Person(name,age){ this.name = name; this.age = age; } function Coder(name,age,job){ Person.call(this,name,age);//改变了this指向 this.job = job; // console.log(this);//Cod

通过寄生组合式继承创建js的异常类

最近项目中在做js的统一的异常处理,需要自定义异常类.理想的设计方案为:自定义一个异常错误类BaseError,继承自Error,然后再自定义若干个系统异常,例如用户取消异常.表单异常.网络异常,继承自BaseError.系统中,根据各个自定义异常做统一的异常处理,例如如果是用户发出取消操作指令,当前调用链则抛出一个用户取消异常,然后由统一异常处理捕获,先判断他是不是继承自BaseError,如果是则再根据事先定义好的处理方案处理. 为啥说这只是理想的设计方案呢?因为es5根本就没有提供js的继

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

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

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

组合继承 将原型链和借用构造函数的技术组合到一块. 使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承. 超类的属性被继承了两次,一次是在子类的构造函数中,使得子类实例拥有各自的属性:一次是在子类的原型中,使得子类拥有相同的属性. 1 function SuperType(name){ 2 this.name = name; 3 this.colors = ["red","blue","green"]; 4 } 5 S

JavaScript ES5类 原型 原型链 组合、原型、寄生式继承

ES5类 原型  原型链 继承 JavaScript中,原型是相对于构造函数(类)的叫法(或者说概念),原型链是相对于构造函数(类)的实例对象的叫法. 对于JavaScript对象,如果在对象自身上找不到该属性,那么就会向上沿着原型链继续查找该属性 创建一个ES5类 在ES5中,类是由函数名首字母大写的函数,通过关键字new创建的. 类的构造函数就是函数自身 一般情况下,ES5类的原型对象prototype是自身构造函数,该类的实例化对象的原型链对象__proto__也是该构造函数,这二者指向同

Javascript 组合继承 原型链继承 寄生继承

Javascript继承通常有三种方式. 第一种:组合式继承: function SuperType(name) { this.name = name; this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function() { console.log(this.name); }; function SubType(name, age) { //通过ca