gpt4 book ai didi

javascript - 在使用 Object.create 创建的对象中使用 super

转载 作者:数据小太阳 更新时间:2023-10-29 06:00:39 24 4
gpt4 key购买 nike

今天早上我遇到了一个 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: use of super property accesses only valid within methods or eval code within methods

和 Chrome:

Uncaught SyntaxError: 'super' keyword unexpected here

当我尝试将属性描述符对象传递给 Object.create 的第二个参数时,也会发生同样的情况。

从语义上讲,它们看起来都和我一样,所以我不太确定发生了什么(是因为对象字面量吗?)。

现在我想知道,这个标准行为是否被准确定义(规范引用值得赞赏)? Object.create 是否缺少某些实现,或者对象字面量是否应该首先不起作用?

最佳答案

ES2015 规范的编辑 Allen Wirfs-Brock 非常友好地 answer my question on twitter .

为什么这是一个错误?

super property references can only occurs in “concise methods” within a class def or obj lit http://tc39.github.io/ecma262/#sec-function-definitions-static-semantics-early-errors

在规范的那个部分,静态语义:早期错误,有四点似乎是相关的:

  • 如果 FormalParameters Contains SuperProperty 为真,则为语法错误。
  • 如果 FunctionBody Contains SuperProperty 为真,则为语法错误。
  • 如果 FormalParameters Contains SuperCall 为真,则为语法错误。
  • 如果 FunctionBody Contains SuperCall 为真,则为语法错误。

因此,超属性调用既不允许在函数参数中使用,也不允许在常规函数体中使用。因此我的问题。

为什么需要使用方法定义?

the reason is that super requires a back link from the method to its containing object. http://tc39.github.io/ecma262/#sec-runtime-semantics-definemethod

意思是,如果我在一个方法中有一个 super 调用,并且我将该方法分配给另一个变量,它仍然必须工作:

let B = {
run() {
super.run();
},
walk() {
console.log(typeof this.run);
}
};

var run = B.run;
run(); // the 'super' binding still works, thanks to the internal MakeMethod

var walk = B.walk;
walk(); // 'undefined': the 'this' binding on the other hand is lost, as usual

这在定义方法语义的部分的第 7 步中指定,目前不会发生在对对象的常规分配中:

  1. 执行MakeMethod(闭包,对象)。

这些语义将来会改变吗?

The back link is essential. Ways to dynamically set it were considered and could be again. Left out b/c error prone

所以有可能像 .toMethod 这样的东西,它可以设置对象 super 引用,毕竟可以引入语言中,使我的初始示例 Object.create 成为可能。

关于javascript - 在使用 Object.create 创建的对象中使用 super,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37189387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com