首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JavaScript寄生组合继承

组合继承弥补了原型链和盗用构造函数的不足,是js中使用最多的继承模式。 寄生继承 寄生继承就是用一个函数包装一个对象,然后返回这个函数的调用,这个函数就变成了个可以随意增添属性的实例或对象。...寄生继承同样适合主要关注对象,而不在乎类型和构造函数的场景。object()函数不是寄生继承所必需的,任何返回新对象的函数都可以在这里使用。...注意 通过寄生继承给对象添加函数会导致函数难以重用,与构造函数模式类似。...寄生组合继承 组合继承存在这一定的效率问题,它的父类构造函数始终会被调用俩次,一次在创建字类原型时调用,另一次在子类构造函数中调用。本质上子类只需要在执行时重写自己的原型就行了。...寄生组合继承可以算是引用类型继承的最佳模式。

25630
您找到你想要的搜索结果了吗?
是的
没有找到

JavaScript之面向对象学九(原型式继承寄生继承)

一、原型式继承继承模式是由道格拉斯*克罗克福德在2006年提出的实现继承的方法. 模式的基本思路:借助原型可以基于已有的对象创建新的对象,同时还不必因此创建自定义类型。...function F() { //定义一个F类型的对象 this.name="111"; } F.prototype=o;//使F的原型对象指向传入对象,也就是说F继承了传入的对象...name="Kobe"; person2.friends.push("Durrant"); alert(person1.friends); //输出:李四,王五,赵六,Durrant 这种继承模式和原型构造函数模式类似...所以根据这个特点,通过更改传入对象的属性值,而省去了创建构造函数的步骤,所以当我们没有必要兴师动众的创建构造函数,只想让一个对象与另一个对象保持类似的情况下,原型继承是完全可以胜任的!

54770

JS原型继承和类继承

继承(构造函数) JS中其实是没有类的概念的,所谓的类也是模拟出来的。特别是当我们是用new 关键字的时候,就使得“类”的概念就越像其他语言中的类了。...类继承是在函数对象内调用父类的构造函数,使得自身获得父类的方法和属性。call和apply方法为类继承提供了支持。通过改变this的作用环境,使得子类本身具有父类的各种属性。...用类继承属性,而原型继承方法。这种模式避免了属性的公用,因为一般来说,每一个子类的属性都是私有的,而方法得到了统一。这种模式称为组合模式,也是继承常用到的一种方法。...从这里,我们也可以看到类继承和原型基础的一些区别。 结论 原型继承比较符合js这种语言的特点。因为它本身就是js强大的原型的一部分。...而类继承,与其称它为继承方式,毋宁说是一种函数的运用技巧来模拟继承罢了。本文是卤煮的一己之见,错误偏颇在所难免,如果有之,请各位斧正。

3.4K90

JavaScript进阶:组合式继承寄生组合式继承

1、组合式继承 组合继承了使用原型链实现对原型属性和方法的继承,同时配合使用构造函数继承实现对实例属性的继承。以免导致多个实例对引用类型的数据共享一份数据。理论上解决了之前继承方式带来的问题。...ChildClass) // true console.log(ChildClass.prototype); // ParentClass {name: 'lisi', getTime: ƒ} 这种继承方式同样并不完美...创建父类 function ParentClass(name) { this.name = name; console.log('执行了一次父类的构造函数') } 可以看出来,组合式继承执行了两次父类的构造函数...2、寄生组合式继承 使用Object.create()使得新创建的对象保持指向ParentClass的原型对象ChildClass.prototype = Object.create(ParentClass.prototype...console.log(child instanceof ChildClass) console.log(ChildClass.prototype); 这样在父类中打印是只执行了一遍父类的构造函数,这样就弥补了组合式继承的缺点

85640

深入理解javascript中的继承机制(4)多继承寄生继承借用构造函数借用构造函数并且复制原型以上

继承 我们知道多继承是面向对象的语言中比较纠结的一个问题,有好处也存在缺陷。这方面我们不多讨论。...同时要注意一个问题,** 如果传入的对象由同名属性,那么属性最后的值会和传入的最后一个对象相同 ** 寄生继承 寄生顾名思义,就是寄生在一个已有的对象,我们在创建对象的时候,寄生在已有的对象上,直接吸收其他对象已有的功能...下面创建一个对象 var twoD = { name: '2D shape', dimensions: 2 }; 实现寄生继承 function triangle(s, h) { var that =...function () { return this.side * this.height / 2; }; that.side = s; that.height = h; return that; } 寄生继承实现的步骤...这样的话,triangle对象会继承Shape构造函数中的属性,但不会继承原型中的属性。

65110

JS 继承

推荐阅读JS继承相关的书籍章节 《JavaScript高级程序设计第3版》第6章——面向对象的程序设计 6种继承的方案,分别是原型链继承、借用构造函数继承、组合继承、原型式继承寄生继承寄生组合式继承...多重继承寄生继承法 构造器借用法 构造器借用与属性拷贝法 《ES6标准入门》第21章——class的继承 《深入理解ES6》第9章——JavaScript中的类 《你不知道的JavaScript》...上卷第6章——行为委托和附录A(ES6中的class) 总结 继承对于JS来说就是父类拥有的方法和属性、静态方法等,子类也要拥有。...继承方法可以有很多,重点在于必须理解并熟。 悉这些对象、原型以及构造器的工作方式,剩下的就简单了。寄生组合式继承是开发者使用比较多的。...回顾寄生组合式继承,主要就是三点: 子类构造函数的 proto指向父类构造器,继承父类的静态方法 子类构造函数的 prototype的 proto指向父类构造器的 prototype,继承父类的方法。

2.9K32

ABAP Netweaver体内的那些寄生编程语言

今天这篇文章的主题是:寄生。...[1240] Jerry距离寄生生物最近的一次,就是前年全家去西岭雪山泡温泉,当时看到有一个室外游泳池,马上跳下去游起来。...这些卵或者孵出的幼虫被其他节肢动物吞食后,就开始下一个寄生的循环。 至于铁线虫为什么可以控制宿主的行动,至今科学家们也没研究个所以然出来。...平时大家提起SAP的Netweaver,总是习惯称之为“SAP ABAP Netweaver”,然而Netweaver内部也存在一些寄生的编程语言——绝大多数ABAP编程人员可能从未意识到它们的存在。...原因在于,尽管大多数的这些寄生编程语言的名称早已为大众所熟知,但它们实际上仅仅是ABAP Netweaver内核里用C/C++实现的精简版的语言编译和运行环境,并未直接开发给ABAP开发人员使用,或者已经被标注为

58600

JS进阶:继承

在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的new 到底是干什么的 一、什么是 JS 原型链 我们知道 JS 有对象,比如 var obj =...5、寄生继承 核心:在原型式继承的基础上,增强对象,返回构造函数 function createAnother(original){ var clone = object(original); /...无法传递参数 6、寄生组合式继承 结合借用构造函数传递参数和寄生模式实现继承 function inheritPrototype(subType, superType){ var prototype...其中constructor表示构造函数,一个类中只能有一个构造函数,有多个会报出SyntaxError错误,如果没有显指定构造方法,则会添加默认的 constructor方法,使用例子如下。...,其实现和上述的寄生组合式继承方式一样 function _inherits(subType, superType) { // 创建对象,创建父类原型的一个副本 // 增强对象,弥补因重写原型而失去的默认的

4.4K10

js实现继承

js实现继承 经典继承(原型链) 缺点:过多的继承了没用的属性 Grandfather.prototype.lastName = 'zhang' function Grandfather() {...grandfather的lastName属性,但是由于原型链的关系,造成了son既会继承grandfather自神的东西,grandfather的原型的东西,father自身的东西和father原型上的东西...,造成了不必要的继承 共享原型 本质:重写原型对象 优点:只会继承父的原型,不会继承父原本自带的属性或方法(只有调用new Father()才会继承自身的东西) 缺点:给本身的原型添加属性或方法时,会把继承的那个原型也修改了...son); // Son {money: 100, hobby: "game"} console.log(son.lastName); // zhang 圣杯模式(寄生组合式继承...) 雏形 本质:重写原型对象 优点:只会继承父的原型,不会继承父原本自带的属性或方法(只有调用new Father()才会继承自身的东西) 缺点:1,这样继承后即使修改了son的原型也不会修改father

5.3K20

原型式继承和类继承

Java和JavaScript都是面向对象的语言,但二者的继承方式截然不同。前者采用类继承(classical inheritence),也是大多数面向对象语言的继承方式。...虽然在es6中引入了类的概念,但它其实只是简化了原来需要我们自己编写的原型链代码的语法糖,从而让js更趋向于传统的面向对象语言而已。要理解这个过程,首先要明白es6中的class做了什么。...Java的类继承 由上面分析可见,es6中的类继承其实还是原型式继承。...那么它与java中真正的类继承相比,有什么区别呢? 类继承的方法都会存在父对象之中,每一次实例,都会将funciton保存在内存中,这会带来性能上的问题。 类继承是不可变的。...类继承可以实现多重继承(Java是通过接口来实现);原型式继承一般来说是不支持多继承的(因为原型链),但可以通过Mixin变相实现多继承

1.4K31

JS继承机制总结

JS继承机制总结 继承就是子类可以使用父类的所有功能,并且对这些功能进行扩展。 JS继承机制主要为原型链继承、构造函数继承、组合继承寄生继承寄生组合继承、原型式继承和混合式继承。...寄生组合继承 继承规则 function Parent() { ... } function Child() { Parent.call(this, ...arguments)//构造函数继承...] ​ ​ ​ let zxy = new Child('zxy') console.log(zxy.name);//zs console.log(zxy.arr);//[1, 2] 复制代码 优点 寄生组合继承算是...缺点 一些引用数据操作的时候会出问题,两个实例会公用继承实例的引用数据类 谨慎定义方法,以免定义方法也继承对象原型的方法重名 无法直接给父级构造函数使用参数 寄生继承 继承规则 //寄生继承也没啥东西的...缺点 一些引用数据操作的时候会出问题,两个实例会公用继承实例的引用数据类 谨慎定义方法,以免定义方法也继承对象原型的方法重名 无法直接给父级构造函数使用参数 混合式继承 继承规则 //这个**混入方式继承

1.5K10
领券