javascript - 为什么 [[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]] 在方法的速记语法上有所不同?我很好奇为什么?
解决方案
首先,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
不是其中之一。
推荐阅读
- mongodb - 猫鼬投射到嵌入式失败
- javascript - Chart.js 创建带有日期点的折线图
- node.js - 在 Jade/Pug 中创建多选
- latex - 在乳胶中出现错误提示“缺少 $ 插入”
- nestjs - nestjs 将响应 ContentType 设置为流值
- c# - 如何在 C# 中对字节类型的图像文件进行服务器端验证
- python - 从远程 Windows 虚拟机复制文件
- entity-relationship - 在 ERD 图中过滤
- java - Android推送通知不起作用华为5.0棒棒糖设备如何修复它?
- primeng - 如何在 Ionic 4 中使用 PrimeNG(评级)组件?