ECMAScript 6是否鼓励在JavaScript中使用经典继承?

时间:2017-08-19 16:18:09

标签: javascript inheritance ecmascript-6

我在JavaScript中遇到了许多proponents真正的原型继承(而不是构造函数继承)。他们建议不要使用new关键字,因为它阻止在语言中使用函数式编程。

ES6是否鼓励使用经典继承?考虑到它引入了关键字class(使用new关键字调用)。

3 个答案:

答案 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;
}

使用callapply以及构造中的现有上下文调用构造函数是很自然的(这大致是使用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.methodEs5ClassWithShallowPrototypeChain中的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社区似乎正在逐渐远离那种经典的面向对象编程风格。