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?
因为
方法和正常函数定义之间的区别是:
-
方法有一个"HomeObject",允许它们使用
super 。 -
方法不可构造,即不能用
new 调用它们。 - 方法的名称不会成为方法范围内的绑定(与命名函数表达式不同)。