根据某个符号名称(符号描述)能够得到同一个符号,用到Symbol的一个静态成员
Symbol.for()。
Symbol.for("符号名/符号描述") //获取共享符号
根据某个符号名称(符号描述)能够得到同一个符号
const syb = Symbol("abc");
const obj1 = {
a: 1,
b: 2,
[syb]: 3
}
const obj2 = {
a: "a",
b: "b",
[syb]: "c"
}
这两个对象里的属性名,用到了同一个符号
它们要在一块,要同在变量syb的作用域内。
现在symbol的静态方法Symbol.for()能够实现同样的功能而且是全局范围。
const syb1 = Symbol.for();
const syb2 = Symbol.for();
const syb3 = Symbol.for("abc");
const syb4 = Symbol.for("abc");
console.log(syb1 === syb2, syb2 === syb3, syb3 === syb4);//true false true
const obj1 = {
a: 1,
b: 2,
[syb1]: 3
}
const obj2 = {
a: "a",
b: "b",
[syb2]: "c"
}
console.log(obj1, obj2); //{a: 1, b: 2, Symbol(undefined): 3} {a: "a", b: "b", Symbol(undefined): "c"}
symbol.for()命名的属性,外部也能访问的到:
const obj = {
a: 1,
b: 2,
[Symbol.for("c")]: 3
}
console.log(obj[Symbol.for("c")]); // 3
根据Symbol.for()的特点,我们可以手写一个Symbol.for()
const SymbolFor = (
() => {
const global = {}; //用于记录有哪些共享符号
return function(name) {
console.log(global)
if (!global[name]) {
global[name] = Symbol(name);
}
console.log(global);
return global[name];
}
}
)();
const syb1 = SymbolFor("abc");
const syb2 = SymbolFor("abc");
console.log(syb1 === syb2);