看看这个简单的代码:

class Animal {
    someField = 42;
    animalFunc() {
        console.log('animal')
    }
}
class Lion extends Animal {
    lionFunc() {
        console.loge('lion')
    }
}
let lion = new Lion();
console.log(lion)

chromium 的结果是:

enter image description here

正如我们所见,实例方法在原型上(对于每个构造函数)

Question:

Why are fields, as opposed to methods, not on the prototype?
I mean , someField is in Animal not in Lion.

推荐答案

这是ECMAScript - 15.7.14 Runtime Semantics: ClassDefinitionEvaluation 25.f中所示的预期行为:

f. Else if element is a ClassFieldDefinition Record, then
  i. If IsStatic of e is false, append element to instanceFields.
  ii. Else, append element to staticElements.

29.年后:

Set F.[[Fields]] to instanceFields.

所以,在我们看到这不是一个bug之后,让我们看看为什么:

In simple words:

正如我们所知,如果我们在原型上有一个函数,并且我们更改了该函数的值,它将被更改为所有人.

如果我们把属性放在原型上,而某个实例改变了属性值,那么它也会改变其他实例中的属性值,当然这种行为不应该发生,所以我们把属性放在实例本身上.

对于静态属性,这是预期的行为,因为我们只有一个实例,这就是它们出现在原型上的原因

Extra:

this条 comments ,Ranando D Washington-King条来自类字段提案

The quote that I mention is about the problem of 101:

Every instance has a copy of the object..期望可能是,也可能不是.在java中考虑定义嵌套类的能力.在这种情况下,每个实例都希望能够看到完全相同的类定义.另一方面,考虑指定一个空array.可能的目的是每个实例都有自己的数组副本,用于存储特定于实例的值.

Javascript相关问答推荐

使用Apps Script缩短谷歌表中的URL?

在JavaScript中,如何将请求的回调函数的结果合并到运行的代码中?

主要内部的ExtJS多个子应用程序

*ngFor和@代表输入decorator 和选角闭合

按钮未放置在html dis位置

传递一个大对象以在Express布局中呈现

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

微软Edge编辑和重新发送未显示""

我可以从React中的出口从主布局调用一个处理程序函数吗?

如何根据当前打开的BottomTab Screeb动态加载React组件?

闭包是将值复制到内存的另一个位置吗?

以Angular 实现ng-Circle-Progress时出错:模块没有导出的成员

环境值在.js文件/Next.js中不起作用

如何在Node.js中排除导出的JS文件

覆盖加载器页面避免对页面上的元素进行操作

将Node.js包发布到GitHub包-错误ENEEDAUTH

AddEventListner,按键事件不工作

如何压缩图像并将其编码为文本?

为什么我的SoupRequest";被重置为初始值,以及如何修复它?

计算对象数组中属性的滚动增量