一個JS小白脆侮,沒有什么項目經(jīng)驗锌畸,看書上十頁的Symbol介紹后,完全不懂為什么要設(shè)計它靖避。
辛苦理解學長的解答蹋绽,寫一下筆記。
如有錯處筋蓖,感謝指出卸耘!(QAQ希望溫柔點。
一粘咖、先知道Symbol的基本用法
Symbol(符號)用于生成唯一的標識
let s1 = Symbol('這個字符串相當于注釋')
let s2 = Symbol('這個字符串相當于注釋')
console.log(s1==s2) //輸出false
//還有一種是在全局符號注冊表創(chuàng)建符號蚣抗,使用Symbol.for()
//我們先理解Symbol,先不管這個
上面的輸出是 false瓮下,因為即使括號里傳進的字符串是一樣的翰铡,每次調(diào)用Symbol生成的標識符都是唯一的,s1和s2分別代表不同的標識讽坏。
二锭魔、設(shè)計Symbol的本質(zhì)目的
Symbol生成唯一標識,可以使對象的屬性具有唯一標識路呜,避免同名屬性沖突(避免新的屬性定義覆蓋舊的屬性定義)迷捧。
舉例子:
① 假如不存在Symbol织咧,正則對象的原型上有個用于匹配的函數(shù)叫regMatch。String.prototype.match默認調(diào)用傳入的正則對象原型上的regMatch漠秋,來轉(zhuǎn)換正則表達式的值笙蒙,并匹配。
function regConstructor(regExp){
this.regExp = regExp
}
regConstructor.prototype.regMatch=function(str){
/*將regExp按照正則表達式的規(guī)則轉(zhuǎn)換庆锦,進行匹配并返回結(jié)果*/
console.log('you got here')
}
function String(str){
this.str = str
}
String.prototype.match=function(regExp){
return regExp.regMatch(this.str)
}
let regExp = new regConstructor(/bar/)
let str = new String('foobar')
//如果我給regExp又定義一個屬性名為regMatch的方法捅位,而且意圖不一定是要改寫匹配規(guī)則
//可能只是無意中重名了,會覆蓋原型上的重名屬性
regExp.regMatch=function(){console.log('OMG!')}
str.match(regExp)//輸出 OMG
②因此搂抒,干脆給原型上的regMatch一個唯一標識艇搀,Symbol值是什么不重要,讓固定調(diào)用它的方法知道是它就行了求晶。
let regMatch = Symbol('我相當于注釋焰雕,其實語言給我們固定了常用內(nèi)置符號,這里我們叫它regMatch')
function regConstructor(regExp){
this.regExp = regExp
}
regConstructor.prototype={
[regMatch]:function(str){
/*將regExp按照正則表達式的規(guī)則轉(zhuǎn)換誉帅,進行匹配并返回結(jié)果*/
console.log('you got here')
}
}
function String(str){
this.str = str
}
String.prototype.match=function(regExp){
return regExp[regMatch](this.str)
}
let regExp = new regConstructor(/bar/)
let str = new String('foobar')
regExp.regMatch=function(){console.log('OMG!')} //根本沒有叫regMatch的屬性,不會有覆蓋
str.match(regExp)//輸出 you got here
Symbol還有很多附加用法右莱,但我覺得先理解為什么蚜锨,再理解怎么用會好些。