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

时间:2018-07-04 02:35:56

标签: javascript ecmascript-6 super

此问题源自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());   

Nacholas在understanding es6中说:

  

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

     

Methods只是包含函数而不是数据的对象属性。

     

任何对super的引用都使用[[HomeObject]]来确定要做什么。   第一步是在[[HomeObject]]上调用Object.getPrototypeOf()以检索对原型的引用。   然后,在原型中搜索具有相同名称的函数。最后,设置此绑定并调用该方法。

因此[[HomeObject]]似乎方法的速记语法有所不同?我很好奇为什么?

1 个答案:

答案 0 :(得分:5)

首先,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不是其中之一。