Javascript 为什么[[HomeObject]]在方法的速记语法上不同?

Javascript 为什么[[HomeObject]]在方法的速记语法上不同?,javascript,ecmascript-6,super,Javascript,Ecmascript 6,Super,这个问题源于 公认的答案是: 因为super只在方法内部有效 但实际上,这两种方法似乎都是: let person = { greeting() { return "Hello"; } }; let friend = { // shorter syntax for method? greeting() { return super.greeting() + ", hi!"; } /

这个问题源于

公认的答案是:

因为super只在方法内部有效

但实际上,这两种方法似乎都是:

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());   
在本书中,纳乔拉斯说:

试图在简明方法之外使用
super
会导致语法错误

方法
只是包含函数而不是数据的对象属性

super
的任何引用都使用[[HomeObject]]来确定要执行的操作。 第一步是调用[[HomeObject]]上的Object.getPrototypeOf()来检索对原型的引用。 然后,在原型中搜索同名函数。最后,将设置此绑定并调用该方法


所以[[HomeObject]]在方法的速记语法上似乎是不同的?我很好奇为什么?

首先,MDN不是正式的Javascript文档。虽然它通常很有用,但它并不是与该语言相关的任何东西的最终来源。该官方规范将在。这就是Javascript语法的定义

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

然后,要查看什么是
MethodDefinition
,请转到它记录
MethodDefinition
步骤的地方,如下所示:

在步骤7中,它调用
MakeMethod()
。如果转到,您将看到设置
[[HomeObject]]
值的地方


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

您能显示两个代码块的包含上下文吗?里面是什么
greet:function(){}
super
而言,它只是普通对象上的属性声明,从技术上讲可能不是“方法”。这只是一个普通的财产。在所有情况下,为什么不使用
语法并避免整个问题呢。您已经要求
super
可用,所以您不会指望
class
。谢谢@jfriend00,1。代码块已完成。2.在MDN中,
greet:function(){}
似乎满足
方法
定义?这让我很困惑。3. <代码>类语法是另一个话题,我只是在看这本书,对
super
行为很好奇。好吧,
super()
是为
设计的。如果这就是你使用它的地方,那么你就没有这些难题需要解决了。我现在没有精力去尝试遵循EMCASCript规范中复杂的语法网络,但正是它设置了
[[HomeObject]]
,然后允许使用
super
。您必须遵循语法定义链,才能准确地了解语法的作用和不作用,从而导致调用或不调用
MakeMethod()
。MDN不是文档源-EMCAScript规范是源。看起来它在这里:。只有快捷方式语法是a(具有超级功能)。常规属性语法只是一个属性,而不是一个“方法”,就像Javascript定义和初始化它所称的“方法”一样。这对我来说非常有趣,如果声明的函数与类似于方法的属性不同,那么它的值函数就是进程发生的函数。“哪一部分在分类中解释了这个过程?”穆拉德索菲耶夫-我不明白你的意思。