【发布时间】:2016-05-12 14:06:22
【问题描述】:
今天早上我遇到了tweet from Šime Vidas,他在其中提出了在对象文字中使用super 的以下可能性:
let A = {
run() {
console.log('A runs');
}
};
let B = {
run() {
super.run();
}
};
Object.setPrototypeOf(B, A);
B.run(); // A runs
这可行,而分配B.__proto__ = A; 似乎也可以在 Firefox 和 Chrome 中使用。
所以我想我可以对 Object.create 做同样的事情:
let A = {
run() {
console.log('A runs');
}
};
let B = Object.create(A);
B.run = function() { super.run() };
很遗憾,这会导致 Firefox 出现错误:
SyntaxError:使用超属性访问仅在方法内有效或在方法内评估代码
和铬:
未捕获的 SyntaxError: 'super' 关键字在此处意外
当我尝试将属性描述符对象传递给Object.create 的第二个参数时,也会发生同样的情况。
在语义上,它们似乎都和我一样,所以我不太确定发生了什么(是因为对象字面量吗?)。
现在我想知道,这种标准行为是否已完全定义(赞赏规范参考)? Object.create 是否缺少一些实现,或者对象字面量是否应该首先不起作用?
【问题讨论】:
-
好吧,在你的情况下,
B是A的instance(好吧,我知道这个词不应该在 JS 上下文中使用)。那么B.run();和A.run();一样吗? -
勾选this tweet这意味着super只能用于shortand定义方法。