【问题标题】:ES6 - Super required in constructorES6 - 构造函数中超级需要
【发布时间】:2016-05-10 17:12:49
【问题描述】:
class Overflow {}
class Stack extends Overflow {
  constructor() {
    super();
  }
}

let stack = new Stack();

https://plnkr.co/edit/JqRfuDAav9opvapwCGpT?p=preview

如果我使用construtor(),我必须调用 super() 总是

为什么super() auto 不在构造函数中调用?

编辑:super() 在这里调用基础constructor AND 设置原型吗?似乎错了。 编辑:为什么需要super()?即使我无意调用基本构造函数。

【问题讨论】:

  • “为什么 super() auto 不在构造函数中调用?” 应该将哪些参数传递给它?没有,全部还是一部分?任何决定都可能引发讨论为什么选择这种方法而不是另一种方法......
  • 总是需要调用super()。尝试在没有super() 的情况下编写有效的 ES6 构造函数。
  • 我知道...我不明白你想用你的评论告诉我什么。
  • “为什么需要super()?即使我不打算调用基本构造函数。”因为this需要正确初始化(即对象调用构造函数生成的需要正确构造)。这主要是扩展外来对象/类的问题,例如Array

标签: javascript ecmascript-6


【解决方案1】:

为什么super() auto 不在构造函数中调用?

所以你可以在构造函数中决定在哪里调用它。这是完全有效的,例如:

constructor(foo) {
    let bar;
    if (foo) {
        bar = /*...*/;
    } else {
        bar = /*...*/;
    }
    super(bar);
}

...在调用super 之前未提供代码使用this(或super.xyz)。

是的,如果您在构造函数中没有对super 进行任何调用,则可以定义语言,它会在开始时自动为您添加(a'la Java),但他们只是决定不那样做。

super() 在这里调用基本构造函数并设置原型吗?好像错了。

不,它正在调用基本构造函数。原型是在调用构造函数之前设置的。和这个旧的 ES5 代码一模一样:

function Derived() {
    Base.call(this);
}

...在:

function Base() {
}

function Derived() {
    Base.call(this);
}
Derived.prototype = Object.create(Base.prototype);
Derived.prototype.constructor = Derived;

为什么需要super()?即使我无意调用基本构造函数。

如果您不打算调用基构造函数,那么您的子类就不是子类,也不应该扩展基类。在严格类型的语言中,您可能会使基础(或基础的子集)成为接口,并让您的类实现它而不是子类化。在 JavaScript 中,没必要,只要让它像你想要的鸭子一样嘎嘎叫。如果instanceof 关系很重要,请创建一个新的基础,它的作用类似于接口,但不会在任何地方做任何事情,并让旧基础和您的类直接继承它。

【讨论】:

  • super() 在这里调用基础constructor() 并设置原型?我没有问过我需要打电话给super(),这似乎是错误的。
  • 也许我的问题更倾向于为什么需要调用super()
  • 不是严格要求的。你也可以return 一些东西,所以如果它在开头自动添加super(),你会做额外的工作。不过它也不完全像 ES5 代码,因为 this 在你调用 super() 之前是未初始化的,所以甚至还没有一个对象可以拥有原型。
  • @old:需要正确初始化this。如果你认为它应该被隐式调用,应该传递哪些参数给它?
【解决方案2】:

阿克塞尔 FTW http://www.2ality.com/2015/02/es6-classes-final.html

总结

为什么需要超级?

  • 新关键字class 不仅仅是语法糖。
  • 分配和实例化只发生在基础构造函数中。

但是为什么会这样呢?

  • 允许扩展奇异对象(感谢 Felix Kling)。

【讨论】:

    猜你喜欢
    • 2018-06-02
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 2014-06-04
    相关资源
    最近更新 更多