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。对象

相关文章
相关标签/搜索