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

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); 这样在父类中打印是只执行了一遍父类的构造函数,这样就弥补了组合式继承的缺点

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

    JavaScript寄生式组合继承

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

    28430

    JS基础-完美掌握继承知识点

    寄生组合式继承(call+寄生式封装) 寄生组合式继承原理: 使用借用构造函数(call)来继承父类this声明的属性/方法 通过寄生式封装函数设置父类prototype为子类prototype的原型来继承父类的...', sonFnInstance) 寄生组合式继承子类实例 [寄生组合式继承子类实例] 寄生组合式继承是最成熟的继承方法: 寄生组合式继承是最成熟的继承方法, 也是现在最常用的继承方法,众多JS库采用的继承方案也是它...寄生组合式继承相对于组合继承有如下优点: 只调用一次父类fatherFn构造函数。 避免在子类prototype上创建不必要多余的属性。...ES6 extends继承: ES6继承的原理跟寄生组合式继承是一样的。...在寄生组合式继承中有一段如下一段修正constructor 指向的代码,很多人对于它的作用以及为什么要修正它不太清楚。

    58620

    一文看懂 JS 继承

    一文看懂 JS 继承 最近回顾 js 继承的时候,发现还是对一些概念不是很清晰。...这里再梳理一下 JS继承的几种主要的方式,构造函数继承、原型链继承、组合继承以及原型式继承寄生继承寄生组合式继承和 ES6 的 Class: 构造函数继承 构造函数继承没有用到 prototype...{ // 增加一些属性或方法 console.log(this.name) } return clone } let child = create(parent) 寄生组合式继承...杂糅了原型链式、构造函数式、组合式、原型式、寄生式而形成的一种方式: 组合继承的方法会调用两次 Parent,一次是在 Child.prototype = new Parent() ,一次是在 Parent.call...这个是组合继承的唯一缺点,寄生组合式解决了这个问题: ? 公有的写在原型 ? 私有的写在构造函数 ? 可以向父类传递参数 ?

    90120

    深入浅出js实现继承的7种方式

    给大家介绍7中js继承的方法   有些人认为JavaScript并不是真正的面向对象语言,在经典的面向对象语言中,您可能倾向于定义类对象,然后您可以简单地定义哪些类继承哪些类(参考C++ inheritance...也可用 Object.create()方法实现 六、寄生组合式继承 //寄生组合式继承 function inheritProto(parents,child){ var o=Object.create...inheritProto(Parents,Child); Child.prototype.getAge=function(){ console.log(this.age); } 寄生组合式继承...,集寄生继承和组合继承的优点与一身,是实现基于类型继承的最有效方式。...YUI 的 YAHOO.lang.extend()方法采用了寄生组合继承,从而让这种模式首次 出现在了一个应用非常广泛的 JavaScript 库中。

    1.8K41

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

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

    57870

    JS 继承

    看过《JavaScript高级程序设计-第3版》 章节 6.3继承的读者应该知道,这2和3小点,正是寄生组合式继承,书中例子没有第1小点。 1和2小点都是相对于设置了 proto链接。...__proto__的知识点后,把上面 ES6例子的用 ES5就比较容易实现了,也就是说实现寄生组合式继承,简版代码就是: // ES5 实现ES6 extends的例子 function Parent...推荐阅读JS继承相关的书籍章节 《JavaScript高级程序设计第3版》第6章——面向对象的程序设计 6种继承的方案,分别是原型链继承、借用构造函数继承、组合继承、原型式继承寄生继承寄生组合式继承...继承方法可以有很多,重点在于必须理解并熟。 悉这些对象、原型以及构造器的工作方式,剩下的就简单了。寄生组合式继承是开发者使用比较多的。...回顾寄生组合式继承,主要就是三点: 子类构造函数的 proto指向父类构造器,继承父类的静态方法 子类构造函数的 prototype的 proto指向父类构造器的 prototype,继承父类的方法。

    2.9K32

    JavaScript实现继承

    寄生继承 寄生继承模式和原型式继承模式很相似,创建了一个仅用于封装继承过程的函数,在函数内部增强对象的功能: function createAnother(obj) { var clone =...寄生组合式继承 通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。寄生组合模式使用寄生模式来实现对父类原型的继承,再将结果指定给子类的原型。...,寄生组合式继承模式只调用了一次 SuperType 构造函数,也避免了在 SubType.prototype 上创建多余的属性。...开发人员普遍认为寄生组合式继承是引用类型最理想的继承范式。...---- 往期精选文章 ES6中一些超级好用的内置方法 浅谈web自适应 使用Three.js制作酷炫无比的无穷隧道特效 一个治愈JavaScript疲劳的学习计划 全栈工程师技能大全 WEB前端性能优化常见方法

    50420

    JavaScript的几种继承方式

    JavaScript的几种继承方式 原型链继承 借助构造函数继承(经典继承) 组合继承:原型链 + 借用构造函数(最常用) 原型式继承 (Object.create) 寄生继承 寄生组合式继承(最理想...console.log('hi'); } // 返回这个对象 return clone; } 缺点:每次创建对象都会创建一遍方法,跟借助构造函数模式一样 6.寄生组合式继承...Child.prototype.constructor = Child; 注意核心代码:Parent.call(this, name);和 Child.prototype = Object.create(Parent.prototype); 寄生组合式继承...,集寄生继承组合式继承的优点,是引用类型最理想的继承范式。...参考 JavaScript常见的六种继承方式[1] JS继承的几种方式[2] JavaScript深入之继承的多种方式和优缺点[3] ECMAScript6入门之 Class的继承[4] 参考资料 [1

    50731

    面试官问:JS继承

    看过《JavaScript高级程序设计-第3版》 章节 6.3继承的读者应该知道,这 2和3小点,正是寄生组合式继承,书中例子没有 第1小点。 1和2小点都是相对于设置了 __proto__链接。...__proto__的知识点后,把上面 ES6例子的用 ES5就比较容易实现了,也就是说实现寄生组合式继承,简版代码就是: // ES5 实现ES6 extends的例子 function Parent...__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } // 寄生组合式继承的核心 function...推荐阅读JS继承相关的书籍章节 《JavaScript高级程序设计第3版》-第6章 面向对象的程序设计,6种继承的方案,分别是原型链继承、借用构造函数继承、组合继承、原型式继承寄生继承寄生组合式继承...继承方法可以有很多,重点在于必须理解并熟 悉这些对象、原型以及构造器的工作方式,剩下的就简单了。寄生组合式继承是开发者使用比较多的。回顾寄生组合式继承

    74210

    JS基础之经典面试题回顾

    闭包使用场景 闭包产生的原因 Js 最大的缺点就是没有类,尤其是es5,自身没有面向对象,变量和函数通常都是写在同一个空间中,变量重名—污染,函数名重名—污染 而闭包能够形成一个封闭的空间,可以避免污染...js继承主要就是通过原型链实现的 总结 一切对象都是继承自Object对象,Object 对象直接继承根源对象null 一切的函数对象(包括 Object 对象),都是继承自 Function 对象...相比第一种原型链继承方式,父类的引用属性不会被共享,优化了第一种继承方式的弊端,但是只能继承父类的实例属性和方法,不能继承原型属性或者方法 组合继承 原型链继承+构造函数继承 原型式继承 借助Object.create...方法实现普通对象的继承 实现的是浅拷贝,多个实例的引用类型属性指向相同的内存,存在篡改的可能 寄生继承 在上面继承基础上进行优化,利用这个浅拷贝的能力再进行增强,添加一些方法 寄生组合式继承 寄生组合式继承...,借助解决普通对象的继承问题的Object.create 方法,在前面几种继承方式的优缺点基础上进行改造,这也是所有继承方式里面相对最优的继承方式 es6 class中的extend使用的就是类似寄生组合式的方法

    6610
    领券