Ste*_*rts 3 javascript symbols ecmascript-6
我已经开始在JavaScript中看看Symbols了,并且已经开始在我的Objects中使用它们来帮助解决名称冲突,但是在使用它时我仍然可以覆盖属性?我很难理解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])Run Code Online (Sandbox Code Playgroud)
据我所知,从我的代码中我仍然可以覆盖对象的属性?那么这个符号是如何帮助的呢?
我用错了吗?
您似乎认为每次访问address新的不同符号值时都会被分配,这是不正确的.
您所做的只是使用Symbol生成唯一值,然后将该值存储在address变量中.这意味着当您稍后再次使用它时,您使用的是之前生成的相同符号.即使您没有使用Symbol,情况也是如此:
let obj = {}; // Create your object
let address = "some key name";
obj[address] = "123 Bond street";
console.log(obj[address]); // Return '123 Bond street'
// Another dev comes along
obj[address] = "456 Regent street"; // Assigns an address property to your object
console.log(obj[address]); // Your address property has been overwrittenRun Code Online (Sandbox Code Playgroud)
简而言之,如果您存储符号,那么您只需存储一个保证唯一的值.但是,这并不能阻止你一遍又一遍地使用它.
更合适的用法Symbol是阻止另一个开发人员在现有对象上创建一个新密钥,其名称与从其他符号生成的密钥相同:
let obj = {}; // Create your object
let address = Symbol("some key name");
obj[address] = "123 Bond street";
console.log(obj[address]); // Return '123 Bond street'
// Another dev comes along
let newProp = Symbol("some key name");
obj[newProp] = "456 Regent street"; // Guaranteed unique new key is created
// There is no way the two properties would ever overwrite each other because each
// was created from a different Symbol
console.log(obj[address]);
console.log(obj[newProp]);Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |