超级关键字在这里意外

时间:2016-09-01 05:31:32

标签: ecmascript-6 super

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

在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 person中声明方法greet的方式,它应该是相同的。那么,为什么我们会收到错误?

1 个答案:

答案 0 :(得分:21)

  

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

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

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

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