ES6 Symbol ,對象匿名(anonymous)屬性實現

Symbol由來

Symbol是ES6引入的新類型,因此在ES5的基礎上,JS就有了字符串(string)、數字型(number)、布爾(bool)、null、undefined和Symbol共六種基本類型(bigint ES2016 添加)。函數

In JavaScript, Symbol is a primitive value.
Symbol是一種原始數據類型
什麼是原始數據類型
A value having the data type "symbol" can be referred to as a "symbol value." In the JavaScript run-time environment, a symbol value is created by invoking the function Symbol, which dynamically produces an anonymous, unique value. A symbol may be used as an object property.
具備Symbol數據類型的值被稱爲"Symbol"值。在JavaScript運行時環境中,經過調用函數Symbol建立Symbol值,該函數動態生成 匿名惟一值。
Symbol can have an optional description, but for debugging purposes only.
MDN Symbol
該數據類型一般被用做一個對象屬性的鍵值——當你想讓它是私有的時候。例如,symbol 類型的鍵存在於各類內置的 JavaScript 對象中。一樣,自定義類也能夠這樣建立私有成員。symbol 數據類型具備很是明確的目的,而且由於其功能性單一的優勢而突出;一個 symbol 實例能夠被賦值到一個左值變量,還能夠經過標識符檢查類型,這就是它的所有特性。不能對該類型實例使用其餘操做符(將「Symbol」類型的實例與 「Number」 類型的實例對比,例如整數 42,該實例就具備將值與其餘類型的值進行比較或組合的運算符)。

建立和使用Symbol

Symbol值的惟一建立方法,是經過調用Symbol()函數來返回,不支持new操做。
Symbol接受一個可選參數,能夠添加一段文本描述,但這段描述不可用於屬性訪問。ui

let firstName = Symbol("first name");
let persion = {};
person[firstName] = "Tom";
console.log("first name" in person); // false
console.log(persion[firstName]); // "Tom"
console.log(firstName); // "Symbol(first name)"

Symbol的描述被存儲在內部的[[Description]]屬性中,只有當調用Symbol的toString方法才能夠讀取這個屬性,但不能直接在代碼裏訪問[[Description]]。
全部使用計算屬性名的地方,均可以使用Symbol。debug

let firstName = Symbol("first name");

let person = {
    [firstName] : "Tom" 
}

Object.defineProperty(person, firstName, { writable: false});

let lastName = Symbol("last name");

Object.defineProperties(person, {
    [lastName]: {
        value: 'Lee',
        writable: false
    }
});

console.log(person[firstName]); // Tome
console.log(person[lastName]); // Lee

const propertyNames = Object.getOwnPropertyNames(person);
console.log(propertyNames); // []

const propertySymbols = Object.getOwnPropertySymbols(person);

console.log(propertySymbols); // [Symbol(first name), Symbol(last name)]

共享體系

Symbol提供了一個全局註冊表,用於在大文件或多文件代碼中追蹤Symbol值。
若是想建立一個可共享的Symbol,須要使用Symbol.for方法。它只接受一個參數,也就是即將建立的Symbol的字符串標識,這個參數也被用做Symbol的描述。code

let uid = Symbol.for("uid");
let obj = {};
obj[uid] = "12345";
console.log(obj[uid]); // "12345"
console.log(uid); // "Symbol(uid)"
console.log(Symbol.forKey(uid)); // "uid"

Symbol.for方法首先在全局註冊表中搜索鍵值爲"uid"的Symbo值,若是存在,直接返回已有的Symbol,不然,建立一個新的Symbol,並使用這個鍵在Symbol全局註冊表中註冊,隨即返回新建立的Symbol。對象

相關文章
相關標籤/搜索