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);
    // 对父类的实例进行了增强
    instance.desc = function(){
        console.log(‘desc‘);
    };
    return instance;
}

Mango.prototype = create(Fruit.prototype); // 通过寄生拿到父类的实例,并没有调用父类的构造函数
Mango.prototype.constructor = Fruit;

let mango1 = new Mango(‘泰国芒果‘,‘优‘);
let mango2 = new Mango(‘海南芒果‘,‘良‘);

console.log(mango1);
console.log(mango2);

二 优点

具有组合继承的优点,同时只调用一次父类的构造函数,避免了内存和性能的浪费,消除了组合继承的缺点。

《高级程序设计》对寄生组合继承对评价:

Babel采用了寄生组合继承来编译class语法糖。

原文地址:https://www.cnblogs.com/sea-breeze/p/10192051.html

时间: 2024-11-05 22:34:55

JavaScript各种继承方式(六):寄生组合继承的相关文章

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

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

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

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

寄生组合继承

寄生组合式继承,是集寄生式继承和组合继承的有点与一身,主要是通过借用构造函数来继承属性,通过原型链的混成形式来继承方法. 先看一个例子: 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;     SubT

对象冒充实现继承,原型链继承方法,以及组合继承模式

function Person (){ this.name=“张三”; this.run = function(){ alert( this.name+'在运动' ) } } Person.prototype.work = function(){ alert( this.name+'在工作’ ) } // web类 继承person类 原型链+对象冒充的组合继承模式 function web(){ Person.call( this )  //  对象冒充实现继承 } var w = new w

继承第一节(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继承之四(寄生组合式继承)

组合式继承尽管很优秀,但是还是有一个地方算完美调用父类构造函数调用了两次也就是实例化了两个父类对象 从这个结果可以发现,父类实例中的属性和方法其实子类已经有了,再添加进来未免多此一举:所以这就是优化的点 function CarModel(c){ this.color=c||"白色"; this.arr=[1,2,3]; this.getColor=function(){ console.log('我的颜色是'+this.color); } } CarModel.prototype.t

JavaScript中继承方式详解

继承一直是面向对象语言中的一个最为人津津乐道的概念,在JavaScript中,继承也是难点之一,下面我尽量用通俗的语言来介绍一下实现继承的几种方法. 原型链 ECMAScript 中描述了原型链的概念,并将原型链作为实现继承的主要方法.其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.这个基本思想说的一点也不基本,那么先说一个在之前博文中提到的概念,原型与实例的关系.我们知道:每一个实例里包含了原型对象中的方法和属性.这是因为任何一个对象都有一个内部属性[[prototype]]

JavaScript中的几种继承方式对比

转自:http://blog.csdn.net/kkkkkxiaofei/article/details/46474069 从'严格'意义上说,JavaScript并不是一门真正的面向对象语言.这种说法原因一般都是觉得javascript作为一门弱类型语言与类似Java或c#之类的强型语言的继承方式有很大的区别,因而默认它就是非主流的面向对象方式,甚至竟有很多书将其描述为'非完全面向对象'语言. 为何需要利用JavaScript实现继承? 早期pc机器的性能确实不敢恭维,所有的压力全在服务器端,

Javascript中的几种继承方式

开篇 从'严格'意义上说,javascript并不是一门真正的面向对象语言.这种说法原因一般都是觉得javascript作为一门弱类型语言与类似java或c#之类的强型语言的继承方式有很大的区别,因而默认它就是非主流的面向对象方式,甚至竟有很多书将其描述为'非完全面向对象'语言.其实个人觉得,什么方式并不重要,重要的是是否具有面向对象的思想,说javascript不是面向对象语言的,往往都可能没有深入研究过javascript的继承方式,故特撰此文以供交流. 为何需要利用javascript实现