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