关于ecmascript 6:超级关键字在这里出乎意料

super keyword unexpected here

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

在ES5中

1
2
3
4
5
6
var person = {
  name:"Person",
  greet: function() {
     return"Hello" + this.name;
  }
};

在ES6中

1
2
3
4
5
6
var person = {
  name:"Person",
  greet() {
     return"Hello" + this.name;
  }
};

ES6的方式与之前的方式有什么不同吗? 如果不是那么在它们里面使用"超级"也应该被视为相等,这不符合,请看下面的两个变量:

下面的工作

1
2
3
4
5
6
7
8
9
10
11
let person = {
  greet(){
   super.greet();
  }
};

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

person.greet();

下面失败了

1
2
3
4
5
6
7
8
9
10
11
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();

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


So, why do we get error?

因为super仅在方法内有效。 greet: function() {}是"普通"属性/函数,而不是方法,因为它不遵循方法语法。

方法和正常函数定义之间的区别是:

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