gpt4 book ai didi

javascript - 为什么 [[HomeObject]] 在方法的简写语法上不同?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:30:01 28 4
gpt4 key购买 nike

本题来源于super keyword unexpected here

接受的答案是:

Because super is only valid inside methods.

但是在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());

understanding es6 ,纳古拉斯说:

Attempting to use super outside of concise methods results in a syntax error

Methods were just object properties that contained functions instead of data.

Any reference to super uses the [[HomeObject]] to determine what to do.The first step is to call Object.getPrototypeOf() on the [[HomeObject]] to retrieve a reference to the prototype.Then, the prototype is searched for a function with the same name. Last, the this binding is set and the method is called.

所以看起来 [[HomeObject]] 在方法的简写语法上有所不同?我很好奇为什么?

最佳答案

首先,MDN 不是官方的 Javascript 文档。虽然它通常很有帮助,但它并不是与该语言相关的任何内容的权威来源。该官方规范将在 ECMAScript specification 中.这就是定义 Javascript 语法的地方。

在那个文档中,有一个叫做 MethodDefinition 的东西.有几种语法可用于方法定义。 greeting() {} 语法是一种可用于 MethodDefinition 的语法。 propName: function() {} 的典型对象文字属性定义不是。下面是它的定义:

enter image description here

然后,要查看什么是 MethodDefinition,您可以转到 section 14.3.8它记录了 MethodDefinition 的步骤,如下所示:

enter image description here

在第 7 步中,它调用 MakeMethod()。如果你去 that part of the specification ,您会看到这是设置 [[HomeObject]] 值的地方。

enter image description here

因此,正如您已经发现 super 依赖于 [[HomeObject]] 的设置和细读规范,这是设置它的唯一方法。因此,要允许 super,它必须调用 MakeMethod() 并且调用 MakeMethod() 的唯一方法是使用以上语法和属性的常规对象字面量语法(例如 propName: fn)不是其中之一。

关于javascript - 为什么 [[HomeObject]] 在方法的简写语法上不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51165046/

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