这个问题源自super keyword unexpected here
被接受的回答说:
因为 super 只在方法内部有效。
但在MDN中,它们两个看起来都是方法:
let person = {
greeting() {
return "Hello";
}
};
let friend = {
// shorter syntax for method?
greeting() {
return super.greeting() + ", hi!";
}
// method?
// greeting: function() {
// return super.greeting() + ", hi!"; // Throw error: Uncaught SyntaxError: 'super' keyword unexpected here
// }
};
Object.setPrototypeOf(friend, person);
console.log(friend.greeting());
在 理解 ES6 中,Nacholas 提到:
所以看起来在简写方法语法中 [[HomeObject]] 是不同的?我很好奇为什么?在简洁方法之外尝试使用
super
会导致语法错误。
方法
只是包含函数而不是数据的对象属性。任何对
super
的引用都使用 [[HomeObject]] 确定要执行的操作。 第一步是在 [[HomeObject]] 上调用 Object.getPrototypeOf() 以检索原型的引用。 然后,在原型中搜索具有相同名称的函数。 最后,设置 this 绑定并调用该方法。
greet: function() {}
这只是一个普通对象上的属性声明,可能在super
看来并不是技术上的"方法"。它只是一个简单的属性。无论如何,为什么不使用class
语法,避免整个问题呢?你已经要求可用的super
,所以你可以信任class
。 - jfriend00MakeMethod()
调用设置了[[HomeObject]]
,然后允许使用super
。您必须跟随语法定义链才能找出确切的语法是什么,哪些语法会导致调用或不调用MakeMethod()
。MDN不是文档来源 - EMCAScript规范是来源。 - jfriend00