前端Vue专辑

六: ES6 符号 Symbol

2020-01-01  本文已影响0人  岁月静好_不负此生

前言

该部分为书籍 深入理解ES6 第六章(符号与符号属性)笔记

创建符号值

let firstName = Symbol("first name");
let person = {};

person[firstName] = "Nicholas";

console.log("first name" in person); // false
console.log(person[firstName]); // "Nicholas"
console.log(firstName); // "Symbol(first name)"

使用符号值

可以在任意能使用 "需计算属性名" 的场合使用符号. 还可以在 Object.defineProperty()Object.defineProperties() 调用中使用它

let firstName = Symbol("first name");

// 使用一个需计算字面量属性
let person = {
    [firstName]: "Nicholas"
};

// 让该属性变为只读
Object.defineProperty(person, firstName, { writable: false });

let lastName = Symbol("last name");

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

console.log(person[firstName]); // "Nicholas"
console.log(person[lastName]); // "Zakas"

共享符号值

符号值的转换

检索符号属性

ES6 新增了Object.getOwnPropertySymbols() 方法,以便让你可以检索对象的符号类型属性。

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

let symbols = Object.getOwnPropertySymbols(object);

console.log(symbols.length); // 1
console.log(symbols[0]); // "Symbol(uid)"
console.log(object[symbols[0]]); // "12345"

使用知名符号暴露内部方法

ES5 的中心主题之一是披露并定义了一些魔术般的成分,而这些部分是当时开发者所无法自行模拟的。 ES6 延续了这些工作,对原先属于语言内部逻辑的部分进行了进一步的暴露,允许使用符号类型的原型属性来定义某些对象的基础行为。

**这些符号是: **

  1. Symbol.hasInstance :供 instanceof 运算符使用的一个方法,用于判断对象继承关系。
  2. Symbol.isConcatSpreadable :一个布尔类型值,在集合对象作为参数传递给Array.prototype.concat() 方法时,指示是否要将该集合的元素扁平化。
  3. Symbol.iterator :返回迭代器(参阅第七章)的一个方法。
  4. Symbol.match :供 String.prototype.match() 函数使用的一个方法,用于比较字符串。
  5. Symbol.replace :供 String.prototype.replace() 函数使用的一个方法,用于替换子字符串。
  6. Symbol.search :供 String.prototype.search() 函数使用的一个方法,用于定位子字符串
  7. Symbol.species :用于产生派生对象(参阅第八章)的构造器。
  8. Symbol.split :供 String.prototype.split() 函数使用的一个方法,用于分割字符串。
  9. Symbol.toPrimitive :返回对象所对应的基本类型值的一个方法。
  10. Symbol.toStringTag :供 String.prototype.toString() 函数使用的一个方法,用于创建对象的描述信息。
  11. Symbol.unscopables :一个对象,该对象的属性指示了哪些属性名不允许被包含在with 语句中。

重写知名符号所定义的方法, 会把一个普通对象改变成奇异对象, 因为它改变了一些默认的内部行为

1. Symbol.hasInstance 属性

2. Symbol.isConcatSpreadable

3. Symbol.match、 Symbol.replace、Symbol.search、Symobol.split

4. Symbol.toPrimittive

function Temperature(degrees) {
    this.degrees = degrees;
}

Temperature.prototype[Symbol.toPrimitive] = function(hint) {
    switch (hint) {
        case "string":
            return this.degrees + "\u00b0"; // 温度符号
        case "number":
            return this.degrees;
        case "default":
            return this.degrees + " degrees";
    }
};

let freezing = new Temperature(32);

console.log(freezing + "!"); // "32 degrees!"
console.log(freezing / 2); // 16
console.log(String(freezing)); // "32°"

5. Symbol.toStringTag

function Person(name) {
    this.name = name;
}

Person.prototype[Symbol.toStringTag] = "Person";

let me = new Person("Nicholas");

console.log(me.toString()); // "[object Person]"
console.log(Object.prototype.toString.call(me)); // "[object Person]"

6. Symbol.unscopables

上一篇下一篇

猜你喜欢

热点阅读