深入理解ES6之—符號與符號屬性


在js已有的基本類型(字符串,數值,布爾型,null和undefined)之外,es6引入了一種新的基本類型:符號(Symbol)。符號起初被設計用於創建對象私有成員。

符號沒有字面量形式,你可以使用全局Symbol函數來創建一個符號值。

let firstName = Symbol();
let person = {};

person[firstName] = "nicolas";
console.log(person[firstName]);

Symbol還可以接受一個額外的參數用於描述符號值。建議始終給符號提供描述信息,以便更好的閱讀代碼和進行調試。

使用符號值

let firstName = Symbol("first name");
let person = {
    [firstName]: "nicolas"
}

//讓改屬性變成只讀的
Object.defineProperties(person, firstName, {
    writable: false
});

let lastName = Symbol("last name");
Object.defineProperties(person, {
    [lastName]: {
        value: "cc",
        writable: false
    }
});
person[lastName] = "dd";
console.log(person[firstName]);//nicolas
console.log(person[lastName]);//cc

共享符號值

如果要創建共享符號值,應使用Symbol.for()方法而不是Symbol()方法。Symbol.for()接受單個字符串類型的參數,作為目標符號值的標識符,同時此參數也會成為該符號的描述信息。

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

Symbol.for()方法首先會搜索全局符號注冊表,看是否存在一個鍵值為“uid”的符號值。

檢索符號屬性

Object.keys()和Object.getPropertyNames()方法可以檢索對象的所有屬性和名稱,前者返回所有的可枚舉屬性名稱,后者返回所有屬性名稱而無視其是否可枚舉。es6新增了Object.getOwnPropertySymbols()方法,以便可以檢索對象的符號類型屬性。

let uid = Symbol.for("uid");

let first = Symbol("first name");
let object = {
    name: "cc",
    age: 26
};

object[uid] = "12345";
object[first] = "111";

console.log(Object.getOwnPropertyNames(object));//["name","age"]
console.log(Object.getOwnPropertySymbols(object));//[Symbol(uid),Symbol(first name)]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM