超级关键字出乎意料

Rat*_*Lal 12 super ecmascript-6

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

在ES5中

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

在ES6中

var person = {
  name: "Person",
  greet() {
     return "Hello " + this.name;
  }
};
Run Code Online (Sandbox Code Playgroud)

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

下面的工作

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

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

person.greet();
Run Code Online (Sandbox Code Playgroud)

下面失败了

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();
Run Code Online (Sandbox Code Playgroud)

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

Fel*_*ing 23

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

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

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

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

  • @FelixKling在ES6中,greet(){}似乎是greet:function(){}的简写表达式.那么为什么super关键字在这两者之间仍然有不同的作用呢? (3认同)
  • es6fiddle似乎将代码编译为ES5。如果将代码发布到浏览器控制台中(假设您的浏览器支持ES6),则会出现“未捕获的TypeError:person.greet不是构造函数(…)”。 (2认同)