Javascript中的符号
我在一个项目中看到了以下代码。有人能解释一下这是怎么回事吗?属性的价值是什么?发生了什么事Javascript中的符号,javascript,ecmascript-6,Javascript,Ecmascript 6,我在一个项目中看到了以下代码。有人能解释一下这是怎么回事吗?属性的价值是什么?发生了什么事这[Attributes]=attrs行 const Attributes = Symbol('User#attrs'); class User { constructor (attrs) { this[Attributes] = attrs; } } 编辑 既然您现在已经澄清了这个问题,只是关于代码行this[Attributes]=att
这[Attributes]=attrs
行
const Attributes = Symbol('User#attrs');
class User {
constructor (attrs) {
this[Attributes] = attrs;
}
}
编辑
既然您现在已经澄清了这个问题,只是关于代码行this[Attributes]=attrs
,请参阅我回答的第二部分,以了解关于这个问题的讨论
原始答案
这是两个新的ES6JavaScript特性
const Attributes=Symbol('User#attrs')代码>创建新的符号对象。符号的功能和对象是。它创建了一个唯一的标识符对象,然后可以用于许多其他用途,其中之一是作为属性名。关于新的符号特性还有很多其他的参考,所以我不在这里重复所有这些
类
定义是。同样,关于这个新语法还有很多其他的参考,所以这里重复这些没有意义。下面是一个等效ES5代码的示例This[Attributes]=attrs代码>使用上面生成的符号在新创建的对象上设置属性
function User(attrs) {
this[Attributes] = attrs;
}
this.attrs = attrs;
讨论此[属性]=attrs
属性
是一个符号,可以用作对象的属性名称。这是一种生成可以用作属性名的唯一键的方法。因此,this[Attributes]=attrs
正在新构造的对象上设置一个属性,并使用Attributes
符号作为属性名称。此属性
符号是唯一的值,它与任何已知字符串都不匹配(事实上,它甚至与其他符号对象都不匹配),因此它是一种生成唯一属性名称的方法
目前尚不清楚该准则为何会这样做:
this[Attributes] = attrs;
而不是像这样:
function User(attrs) {
this[Attributes] = attrs;
}
this.attrs = attrs;
我们必须了解更多的上下文,了解如何使用它,以及为什么不能使用纯字符串属性来代替符号,因为您没有提供足够的上下文让我们知道
一个可能的用途是保护隐私。如果Attributes
不是公共的,那么这是一种在对象上创建外部世界不知道如何访问的属性的方法,因为您必须具有Attributes
的当前值才能正确访问该属性。正如您所展示的,在同一范围内具有User
和Attributes
的代码似乎不是私有的,但可能只有User
被导出到公共范围
另一个可能的用途是独特性。如果用户
对象可能由其他代码添加了许多其他属性,则属性
将创建一个唯一的属性名称,该名称不能与其他属性名称冲突。在这种情况下,这似乎不太可能,但这是符号的一种可能用法。Edit
既然您现在已经澄清了这个问题,只是关于代码行this[Attributes]=attrs
,请参阅我回答的第二部分,以了解关于这个问题的讨论
原始答案
这是两个新的ES6JavaScript特性
const Attributes=Symbol('User#attrs')代码>创建新的符号对象。符号的功能和对象是。它创建了一个唯一的标识符对象,然后可以用于许多其他用途,其中之一是作为属性名。关于新的符号特性还有很多其他的参考,所以我不在这里重复所有这些
类
定义是。同样,关于这个新语法还有很多其他的参考,所以这里重复这些没有意义。下面是一个等效ES5代码的示例This[Attributes]=attrs代码>使用上面生成的符号在新创建的对象上设置属性
function User(attrs) {
this[Attributes] = attrs;
}
this.attrs = attrs;
讨论此[属性]=attrs
属性
是一个符号,可以用作对象的属性名称。这是一种生成可以用作属性名的唯一键的方法。因此,this[Attributes]=attrs
正在新构造的对象上设置一个属性,并使用Attributes
符号作为属性名称。此属性
符号是唯一的值,它与任何已知字符串都不匹配(事实上,它甚至与其他符号对象都不匹配),因此它是一种生成唯一属性名称的方法
目前尚不清楚该准则为何会这样做:
this[Attributes] = attrs;
而不是像这样:
function User(attrs) {
this[Attributes] = attrs;
}
this.attrs = attrs;
我们必须了解更多的上下文,了解如何使用它,以及为什么不能使用纯字符串属性来代替符号,因为您没有提供足够的上下文让我们知道
一个可能的用途是保护隐私。如果Attributes
不是公共的,那么这是一种在对象上创建外部世界不知道如何访问的属性的方法,因为您必须具有Attributes
的当前值才能正确访问该属性。正如您所展示的,在同一范围内具有User
和Attributes
的代码似乎不是私有的,但可能只有User
被导出到公共范围
另一个可能的用途是独特性。如果
用户
对象可能由其他代码添加了许多其他属性,则属性
将创建一个唯一的属性名称,该名称不能与其他属性名称冲突。在这种情况下,这似乎不太可能,但这是符号的一种可能用法。Symbol
为任何对象创建不可碰撞的键:
const first = Symbol('debug-name');
const second = Symbol('debug-name');
first !== second // true;
const anObj = {};
anObj[first] = 123;
anObj[second] = 456;
console.log(anObj) // {Symbol('debug-name'): 123, Symbol('debug-name'): 456}
注意,即使f