簡體   English   中英

JavaScript中的符號

[英]Symbol in Javascript

我在項目中看到了以下代碼。 誰能解釋這是怎么回事? 屬性的價值是什么? 這是什么情況this[Attributes] = attrs行?

 const Attributes = Symbol('User#attrs');
    class User {   
      constructor (attrs) {
        this[Attributes] = attrs;
      }
    }

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}

請注意,即使第firstsecond變量具有相同的調試字符串,它們也會在anObj創建不同的鍵。 有權first訪問的任何人都可以將該密鑰添加到任何對象,並且不會與該對象中的任何其他密鑰沖突。

可以使用它代替魔術字符串來管理協議:

// ES5
someObject.MY_LIB_attributes = [1, 2, 3];
// Only safe if no other library uses the key
// "MY_LIB_attributes"

// ES2015+
export const Attributes = Symbol('myLib#attributes');

import { Attributes } from 'my-lib';

someObj[Attributes] = [1, 2, 3];
// Safe as long as no other library uses
// *this* Symbol instance for some other purpose.

編輯

由於您現在已經闡明了問題僅與代碼行this[Attributes] = attrs ,請參閱我的答案的第二部分以進行討論。

原始答案

這是ES6 Javascript的新功能。

  1. const Attributes = Symbol('User#attrs'); 創建一個新的Symbol對象。 這里描述符號功能和對象。 它創建一個唯一的標識符對象,然后可以將其用於許多其他用途,其中之一是用作屬性名稱。 新的符號功能上還有許多其他參考,因此在此不再贅述。

  2. class定義是用於聲明原型類ES6方法 同樣,在此新語法上還有許多其他參考,因此這里沒有重復所有這些內容。 下面有一個等效ES5代碼的示例。

  3. 這行this[Attributes] = attrs; 使用上面生成的符號在新創建的對象上設置屬性。

類定義等效於常規的構造函數聲明,如下所示:

function User(attrs) {
    this[Attributes] = attrs;
}

討論this[Attributes] = attrs

Attributes是一個符號,可以用作對象上的屬性名稱。 這是生成可用作屬性名稱的唯一鍵的一種方式。 因此, this[Attributes] = attrs在新構造的對象上設置屬性,並且使用Attributes符號作為屬性名稱。 Attributes符號是一個唯一值,不會與任何已知的字符串匹配(實際上,它甚至不會與其他Symbol對象匹配),因此這是制作唯一屬性名稱的一種方式。

目前尚不清楚代碼為什么要這樣做:

this[Attributes] = attrs;

而不是像這樣:

this.attrs = attrs;

我們將不得不了解更多有關如何使用它的上下文,以及為什么不能使用純字符串屬性代替Symbol,因為您沒有提供足夠的上下文讓我們知道。

一種可能的用途是保護隱私。 如果Attributes不是公開的,則這是一種在外界不知道如何訪問的對象上創建屬性的方法,因為必須具有Attributes的當前值才能正確訪問該Attributes 正如您所展示的那樣,在同一范圍內具有UserAttributes的代碼似乎不是私有的,但也許只有User導出到了公共范圍。

另一個可能的用途是唯一性。 如果User對象可能通過其他代碼添加了許多其他屬性,則Attributes創建一個唯一的屬性名稱,該名稱不能與其他屬性名稱沖突。 在這種情況下,這似乎不太可能,但這是使用符號的一種可能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM