我在JavaScript中遇到了许多proponents真正的原型继承(而不是构造函数继承)。他们建议不要使用new
关键字,因为它阻止在语言中使用函数式编程。
ES6是否鼓励使用经典继承?考虑到它引入了关键字class
(使用new
关键字调用)。
答案 0 :(得分:2)
这篇文章已经过时了。从ECMAScript 6开始,无法将.apply()
与new
一起使用的问题已得到解决。您现在可以使用扩展语法:new Person(...args)
。
新的class
语法通过提供更好的代码组织,更简洁的语法和以前无法实现的某些功能来增强原型继承。即使它使用关键字class
,它也与Java,C ++等中的经典继承无关。
无论您决定使用什么,都要努力编写清晰,易懂,可维护的代码,并且您会做得很好。
答案 1 :(得分:1)
在JS中有许多模式可以实现继承。 ES6课程只是其中之一的语法糖。
ECMAScript 6仍然是JavaScript,并没有鼓励任何特定的范例。但是,ES6类提出了一些实际的考虑因素,它们是ES6中继承的惯用解决方案。
当ES6类由非ES6类继承时,可能会发生错误:
class Es6Class {}
function Es5Class() {
var _this = Object.create(Es6Class.prototype);
_this = Es6Class.apply(_this, arguments);
return _this;
}
使用call
或apply
以及构造中的现有上下文调用构造函数是很自然的(这大致是使用Babel或Typescript转换ES6类时发生的情况)。但ES6类具有内置保护功能,可以在没有new
的情况下调用它们,因此Es5Class
将失败。
当ES6类继承实现随机继承配方的ES5类时,会出现另一个问题(如this React question所示):
function Es5ClassWithShallowPrototypeChain() {
var _this = {};
_this = AnotherEs5Class.call(_this, arguments);
_this.method = function () {};
}
class Es6Class {
method() {}
}
在上面的代码中,Es6Class
会覆盖method
,但这不会发生,因为method
是实例方法(this.method
) Es5ClassWithShallowPrototypeChain
中的this.__proto__method
和原型方法(Es6Class
)。
开发人员可以自由选择他/她感到舒服的任何继承配方,但应始终考虑配方如何影响第三方代码。虽然ES6类继承实现对于JS来说是惯用的,但通常可以在ES6代码中用作经验法则。
答案 2 :(得分:0)
我会说是,确实如此。据我所知,它仍然是典型的继承; class关键字形式化了一个通用的设计模式。本文涵盖了这一点:
Better JavaScript with ES6, Pt. II: A Deep Dive into Classes
你仍然可以做functional programming in JavaScript,但总的来说,JS社区似乎正在逐渐远离那种经典的面向对象编程风格。