JavaScript符号在对象内部无法正常工作
我已经开始研究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
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()
访问它。Plususer.id=28
正在分配给一个新的不同属性,属性名为“id”
,与用户[id]
无关。这和你的符号不同。@Olian04这就是我要问的:Kinldy,你能帮我看看这个问题吗,因为这正是我所遭受的痛苦。链接:@我的答案应该足够了。必须将符号实例id
与代码的其余部分隔离开来,方法是将其放入自己的代码块/作用域、自己的ESM模块等中。
let id2 = Symbol("id");
console.log(user[id2]); // undefined