Es6 symbol-知名符號

Symbol.hasInstance

obj instanceof A等效於 A[Symbol.hasInstance](obj)
可以改變 obj instanceof A 的輸出結果

function A () {
}

const obj = new A();
conole.log(obj instanceof A);  // true
console.log(A[Symbol.hasInstance](obj); // true
Object.defineProperty(A, Symbol.hasIntance,{
	value: function(obj) {
		return false;
	}
});

conole.log(obj instanceof A);  // false
console.log(A[Symbol.hasInstance](obj); // false

Symbol.isConcatSpreadable

用於改變數組的concat的結果。

const arr = [12, 465];
const obj = { 0: 4, 1: 45, length: 2}
console.log(arr.concat(obj) //[12,456,obj]
obj[Symbol.isConcatSpreadable] = true;
console.log(arr.concat(obj) //[12,456,4,45];
當Symbol.isConcatSpreadable 爲 false 時,concat不會展開傳入得參數。

Symbol.toPrimitive

用於改變類型轉換的結果。

 const obj = {};
 console.log(obj.valueOf());
 console.log(obj.toString());
 console.log(obj * 123);     //NaN
 

Symbol.toStringTag

class Person {

}

const p = new Peron();
const arr = [1,2];
console.log(Object.prototype.toString.apply(arr));  // [Object Array]
console.log(Object.prototype.toString.apply(p));//[Object Object]
若是想讓Object.prototype.toString.apply(p)的結果爲[Object Person],則需要用到Symbol.toStringTag.
class Person{
	[Symbo.toStringTag] = 'Person'
}

console.log(Object.prototype.toString.apply(p)); [Objrct Person]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章