这里出乎意料的超级关键字

问题描述 投票:0回答:3

根据 ES6 速记初始化程序,以下 2 种方法是相同的:

在 ES5 中

var person = {
  name: "Person",
  greet: function() {
     return "Hello " + this.name;
  }
};

在 ES6 中

var person = {
  name: "Person",
  greet() {
     return "Hello " + this.name;
  }
};

ES6 的方式和以前的方式有什么不同吗?如果不是,那么在它们内部使用“super”也应该被视为相等,这不成立,请参阅下面的两个变体:

以下作品

let person = {
  greet(){
   super.greet(); 
  }
};

Object.setPrototypeOf(person, {
  greet: function(){ console.log("Prototype method"); }
});

person.greet();

以下失败

let person = {
  greet: function(){
   super.greet(); // Throw error: Uncaught SyntaxError: 'super' keyword unexpected here
  }
};

Object.setPrototypeOf(person, {
  greet: function(){ console.log("Prototype method"); }
});

person.greet();

上面两个例子唯一的区别是我们在 person 对象中声明方法greet的方式,应该是相同的。那么,为什么我们会收到错误?

ecmascript-6 super
3个回答
34
投票

那么,为什么我们会收到错误?

因为

super
仅在方法内有效。
greet: function() {}
是一个“正常”属性/函数,而不是方法,因为它不遵循方法语法。

方法和普通函数定义之间的区别是:

  • 方法有一个“HomeObject”,这使得它们可以使用
    super
  • 方法不可构造,即不能用
    new
    调用它们。
  • 方法的名称不会成为方法范围内的绑定(与命名函数表达式不同)。

0
投票

检查构造函数的拼写 如果您有拼写错误,也可能会出现此错误。


0
投票

我是通过搜索 V8 错误消息'super'关键字意外来到这里的。以下是错误的可能原因:

  • super.prop
    只能用在简洁方法(
    foo() {}
    *foo() {}
    async foo() {}
    async *foo() {}
    )、访问器(
    get foo() {}
    set foo() {}
    static get foo(val) {}
    )的主体中static set foo(val) {}
    ),或
    constructor() {}
    parser-base.h)。
    • 您无法从普通函数
      super
      或箭头函数
      foo: function() {}
      访问
      foo: () => {}
      。您必须将其转换为简洁的函数
      foo() {}
  • super()
    调用只能在派生类 (
    parser-base.h
    ) 的 constructor() {} 内部。
    • 如果您想要某个方法
      foo()
      来调用超类的
      foo()
      ,那么您可以调用
      foo() {super.foo()}
      ,而不是
      foo() {super()}
    • 确保
      class
      extends
      其他课程。
© www.soinside.com 2019 - 2024. All rights reserved.