Javascript中是否存在本质上只读的对象

Are there intrinsically read-only objects in Javascript?

本文关键字:只读 对象 本质上 存在 是否 Javascript      更新时间:2023-09-26

我的Javascript代码中有一个奇怪的情况,我无法解释。到目前为止,它只在Safari/Mac上被观察到。

我有这样一行:

dict[id].sliceHovered = true;

有时会抛出一个错误:

尝试分配只读属性。

还有:

  • dict是我自己用dict={}创建的一个空白对象
  • id是由外部数据提供的,所以它可以是任何东西(我还不知道是哪个特定的值导致了这种情况)
  • sliceHovered显然不是Javascript构建的东西的名称中
  • dict中的对象属于我自己的类型。它们有一个sliceHovered成员,但它不是Javascript定义的属性(如Object.defineProperty()),只是一个常规属性(构造函数执行this.sliceHovered=false
  • "use strict"打开
  • Object.freeze()Object.seal()Object.preventExtensions()const不在整个码库中的任何地方使用

因此,这样的错误怎么会出现在这里,真是令人费解。如果我有一个索引错误,并且dict[id]将是undefinednull,则错误将不同。我唯一的想法是,由于dict被创建为dict={},那么它从Object继承,并且id可能映射到一些继承的属性。但这意味着从dict[id]返回的对象本身必须是只读的,因为sliceHovered绝对不是现有Javascript属性的名称。

然而,我想不出有任何Javascript对象会像那样本质上是只读的。

有什么想法吗?

您可以检查这种情况

我唯一的想法是,由于dict被创建为dict={},那么它继承自Object

带有:var dict = Object.create(null);

还要尝试使用Object.getOwnPropertyDescriptor(dict, id)来确保描述符具有正确的值。