Ecmascript 6 超级关键字在这里出人意料

Ecmascript 6 超级关键字在这里出人意料,ecmascript-6,super,Ecmascript 6,Super,根据ES6速记初始化器,以下两种方法相同: 在ES5中 在ES6中 ES6方式是否与前一种方式有所不同?如果没有,则在它们内部使用“super”也应被视为相等,这不成立,请参见以下两个变量: 下面的作品 以下失败 以上两个示例中唯一的区别是我们在person对象中声明方法greet的方式,应该是相同的。那么,为什么会出现错误呢 那么,为什么会出现错误呢 因为super仅在内部有效greet:function(){}是“普通”属性/函数,而不是方法,因为它不遵循方法语法 方法和普通函数定义之间的

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

在ES5中 在ES6中 ES6方式是否与前一种方式有所不同?如果没有,则在它们内部使用“super”也应被视为相等,这不成立,请参见以下两个变量:

下面的作品 以下失败
以上两个示例中唯一的区别是我们在person对象中声明方法greet的方式,应该是相同的。那么,为什么会出现错误呢

那么,为什么会出现错误呢

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

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

  • 方法有一个“同源对象”,这就是允许它们使用
    super
  • 方法是不可构造的,即不能用
    new
    调用它们
  • 方法的名称不会成为方法作用域中的绑定(与命名函数表达式不同)

关于“方法是不可构造的,即不能用new调用它们”,我可以使用new创建新对象:es6fiddle似乎将代码编译为ES5。如果您将代码发布到浏览器控制台(假设您的浏览器支持ES6),您将得到
uncaughttypeerror:person.greet不是构造函数(…)
。您能为ES6推荐任何最佳书籍或其他学习资源吗?在ES6中,greet(){}似乎是greet:function(){}的简写表达式。那么为什么super关键字在这两个词之间仍然起着不同的作用呢?谢谢你的耐心,我已经把我的疑问转移到另一个词上并得到了答案。现在我完全理解了速记语法(method)在ES2015中不仅仅是一个较短的函数语法。(还学习了如何阅读规范…)
var person = {
  name: "Person",
  greet: function() {
     return "Hello " + this.name;
  }
};
var person = {
  name: "Person",
  greet() {
     return "Hello " + this.name;
  }
};
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();