我对JavaScript很陌生。我正在阅读《Web开发者专业JavaScript》第三版第6章中“寄生式组合继承”的部分。随着ES6的推出和强烈推动远离使用“new”和深层次的继承,还有使用寄生式组合继承模式的目的吗?
现在使用什么?我感觉自己正在学习一些毫无用处的模式。我知道人们现在只使用Object.create()
和Object.assign()
,那为什么还要提到这些继承模式呢?
我对JavaScript很陌生。我正在阅读《Web开发者专业JavaScript》第三版第6章中“寄生式组合继承”的部分。随着ES6的推出和强烈推动远离使用“new”和深层次的继承,还有使用寄生式组合继承模式的目的吗?
现在使用什么?我感觉自己正在学习一些毫无用处的模式。我知道人们现在只使用Object.create()
和Object.assign()
,那为什么还要提到这些继承模式呢?
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
并没有引入一种新的继承方式。它们只是对prototype inheritance
的语法糖。您可以在此链接中阅读更多信息:Link - Noctisdark
new
的模式(包括Object.create
,它绝对不会使用new
关键字),但我认为目前 ES6 类是(或曾经是)普遍存在的,并且这些类确实依赖于new
。 - Bergibar.prototype = Object.create(foo.prototype); bar.prototype.baz = "whatever";
这种模式字面上就是寄生继承吗?Object.create()
部分创建一个对象,将其链接到另一个对象,然后您手动增强返回的对象。这不是与寄生继承发生的事情完全一样吗? - doubleOrtObject.create()
polyfill的一半,另一半类似于我在其他评论中描述的模式的部分,在这个模式中,你增强了由Object.create()
返回的对象。在Crockford的例子中没有复制(或者我误解了你想传达的意思),只是使用new
进行实例化(这基本上是幕后链接),然后进行增强。 - doubleOrt