首页 > 解决方案 > 为什么 [[HomeObject]] 方法的简写语法不同?

问题描述

这个问题来源于super 关键字意外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());   

理解 es6时,Nacholas 说:

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

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

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

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

标签: javascriptecmascript-6super

解决方案


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

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

在此处输入图像描述

然后,要查看 aMethodDefinition是什么,请转到第 14.3.8 节,其中记录了 a 的步骤,MethodDefinition如下所示:

在此处输入图像描述

在步骤 7 中,它调用MakeMethod(). 如果您转到规范的那部分,您会看到[[HomeObject]]设置值的地方。

在此处输入图像描述

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


推荐阅读