寄生组合继承还在使用吗?

4

我对JavaScript很陌生。我正在阅读《Web开发者专业JavaScript》第三版第6章中“寄生式组合继承”的部分。随着ES6的推出和强烈推动远离使用“new”和深层次的继承,还有使用寄生式组合继承模式的目的吗?

现在使用什么?我感觉自己正在学习一些毫无用处的模式。我知道人们现在只使用Object.create()Object.assign(),那为什么还要提到这些继承模式呢?


3
冒昧表达我的无知,我以JS为职业开发数年,但从未听说过这个概念。此外,如果我在Google中搜索它,我得到的前两篇文章都是关于它的stackoverflow问题,这些问题似乎来自于和你一样正在阅读同一本书的人... 这里这里... - Alexander Nied
2
是的,抱歉,我想说的是,似乎唯一提到它的时候就是那些读这本特定书的人。看起来可能更多是学术上的东西,而不是广泛使用的东西,至少在那个名字下。我认为你不应该担心记住它。 - Alexander Nied
1
@EvenSteven 是的,有很多不需要使用 new 的模式(包括 Object.create,它绝对不会使用 new 关键字),但我认为目前 ES6 类是(或曾经是)普遍存在的,并且这些类确实依赖于 new - Bergi
@Bergi 不是 bar.prototype = Object.create(foo.prototype); bar.prototype.baz = "whatever"; 这种模式字面上就是寄生继承吗?Object.create() 部分创建一个对象,将其链接到另一个对象,然后您手动增强返回的对象。这不是与寄生继承发生的事情完全一样吗? - doubleOrt
@Bergi 我指的是这里的例子。这个例子基本上是我见过的Object.create() polyfill的一半,另一半类似于我在其他评论中描述的模式的部分,在这个模式中,你增强了由Object.create()返回的对象。在Crockford的例子中没有复制(或者我误解了你想传达的意思),只是使用new进行实例化(这基本上是幕后链接),然后进行增强。 - doubleOrt
显示剩余25条评论
1个回答

3
我所知道的在JavaScript中实现继承的最佳方法如下:
let SubClass = function() { SuperClass.call(this, arguments); /*Do other stuff here*/ }
SubClass.prototype = Object.create(SuperClass.prototype);

Object.create(o) 的作用与 {__proto__: o} 差不多,都是创建一个新对象,并以 o 为其原型。

然而,由于时代变迁,我们现在生活在 ES6 的世界中,您更应该使用 ES6 继承的标准方式:

class SubClass extends SuperClass {
    constructor() { super(...arguments); /*Do other stuff here*/ }
}

这些是目前最常用的方法,选择适合您的方法即可。

希望这会有所帮助。


“class” 和 “extends” 不是引入 JavaScript 的初学者?即使在 ES6 中,它们也不鼓励常规使用吗? - Even Steven
2
它们不是。在Javascript中,classextends并没有引入一种新的继承方式。它们只是对prototype inheritance的语法糖。您可以在此链接中阅读更多信息:Link - Noctisdark
谢谢!我刚刚进行了一些调查研究,找出了我遇到这个“信念”的地方,看来我应该小心听取Eric Elliot的建议。他往往是Google上的顶级结果,但会将Crockford的工作推向极端。我现在不太确定从哪里开始了。 - Even Steven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接