JavaScript符号在对象内部无法正常工作

JavaScript符号在对象内部无法正常工作,javascript,ecmascript-6,symbols,Javascript,Ecmascript 6,Symbols,我已经开始研究JavaScript中的符号,并开始在我的对象中使用它们来帮助解决名称冲突,但我仍然可以在使用它们时覆盖属性? //第一个开发人员代码 let id = Symbol('id'); let user = { name: 'Karan', [id]: 25, } 现在我克隆了他们的代码并使用了它 我仍然可以这样做,user[id]=45//这将把id值变成45 这与使用普通字符串“id”代替符号相同 (第一个开发人员代码) 现在我克隆了他们的代码,或者说其他开发人员克隆了 user

我已经开始研究JavaScript中的符号,并开始在我的对象中使用它们来帮助解决名称冲突,但我仍然可以在使用它们时覆盖属性?

//第一个开发人员代码

let id = Symbol('id');
let user = {
name: 'Karan',
[id]: 25,
}
现在我克隆了他们的代码并使用了它

我仍然可以这样做,
user[id]=45//这将把id值变成45

这与使用普通字符串“id”代替符号相同

(第一个开发人员代码)

现在我克隆了他们的代码,或者说其他开发人员克隆了

user.id=28


id的值已更改

其思想是保持符号实例的私有性。它不会神奇地阻止您覆盖属性

代码的一部分可以创建符号:

let id = Symbol("id");
然后,他们可以将此符号用作对象的属性:`

let user = {
  [id]: 123,
};
但是,如果属性不能访问同一符号实例,则代码的另一部分将无法覆盖属性

例如,如果另一段代码创建了它们自己的符号,那么它们检索的属性将是
未定义的

let id2 = Symbol("id");
console.log(user[id2]); // undefined
您可以将此符号实例与代码的其余部分隔离开来

实现这一点的现代方法是将其放入ESM模块中,并且不导出变量


在您的例子中,
id
似乎是一个全局变量。这对你没有帮助,因为你不能保证没有人会使用这个变量。

你的问题是什么?你能在问题的一个片段中加一个吗?这将有助于传达你所面临的问题。也包括预期行为和实际行为。“我仍然可以执行
user[id]=45
”-仅当
id
是您可以访问的全局变量时。您必须将符号变量
id
的值保持为私有(外部代码不可用)才能使用此工具。而且,即使这样,仍然可以使用
Object.getOwnPropertySymbols()
访问它。Plus
user.id=28
正在分配给一个新的不同属性,属性名为
“id”
,与
用户[id]
无关。这和你的符号不同。@Olian04这就是我要问的:Kinldy,你能帮我看看这个问题吗,因为这正是我所遭受的痛苦。链接:@我的答案应该足够了。必须将符号实例
id
与代码的其余部分隔离开来,方法是将其放入自己的代码块/作用域、自己的ESM模块等中。
let id2 = Symbol("id");
console.log(user[id2]); // undefined