【发布时间】:2018-11-21 04:36:48
【问题描述】:
我已经开始研究 JavaScript 中的符号,并开始在我的对象中使用它们来帮助解决名称冲突,但是在使用它们时我仍然可以覆盖属性吗?我很难理解符号在 JavaScript 中的意义。他们被谈论了很多,人们说他们很聪明,因为他们不会在对象中引起命名冲突,但我看不出是怎么回事?
// Create your object
let obj = {};
// Create your Symbol
let address = Symbol("the address symbol");
// Assign your Symbol as a key to a value
obj[address] = "123 Bond street";
// Return '123 Bond street'
console.log(obj[address])
// Another dev comes along
// Assigns an address property to your object
obj[address] = "456 Regent street";
// Your address property has been overwritten?
console.log(obj[address])
从我的代码中可以看出,我仍然可以覆盖对象上的属性吗?那么 Symbol 有什么帮助呢?
我用错了吗?
【问题讨论】:
-
当然,您正在覆盖该属性。您创建的符号存储在
address中,然后您设置了该键两次。您的代码只是生成一个动态唯一符号,然后将其静态存储。 -
它会停止
obj.address = "456 Regent street"; -
@dandavis 当然会,因为
address从一开始就不是键名。 -
@ScottMarcus: 对,所以如果你控制对本地的访问,你就控制对道具的访问......
-
您需要创建第二个符号:
const address2 = Symbol("the address symbol");。如果您的代码确实避免了名称冲突,您将如何更新使用 Symbol 键存储的属性?
标签: javascript ecmascript-6 symbols