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