又介紹一個(gè)老朋友——instanceof。
對(duì)于值類(lèi)型,你可以通過(guò)typeof判斷,string/number/boolean都很清楚,但是typeof在判斷到引用類(lèi)型的時(shí)候,返回值只有object/function,你不知道它到底是一個(gè)object對(duì)象,還是數(shù)組,還是new Number等等。
這個(gè)時(shí)候就需要用到instanceof。例如:
上圖中,f1這個(gè)對(duì)象是被Foo創(chuàng)建,但是“f1 instanceof Object”為什么是true呢?
至于為什么過(guò)會(huì)兒再說(shuō),先把instanceof判斷的規(guī)則告訴大家。根據(jù)以上代碼看下圖:
Instanceof運(yùn)算符的第一個(gè)變量是一個(gè)對(duì)象,暫時(shí)稱(chēng)為A;第二個(gè)變量一般是一個(gè)函數(shù),暫時(shí)稱(chēng)為B。
Instanceof的判斷規(guī)則是:沿著A的proto這條線來(lái)找,同時(shí)沿著B(niǎo)的prototype這條線來(lái)找,如果兩條線能找到同一個(gè)引用,即同一個(gè)對(duì)象,那么就返回true。如果找到終點(diǎn)還未重合,則返回false。
按照以上規(guī)則,大家看看“ f1 instanceof Object ”這句代碼是不是true? 根據(jù)上圖很容易就能看出來(lái),就是true。
通過(guò)上以規(guī)則,你可以解釋很多比較怪異的現(xiàn)象,例如:
這些看似很混亂的東西,答案卻都是true,這是為何?
正好,這里也接上了咱們上一節(jié)說(shuō)的“亂”。
上一節(jié)咱們貼了好多的圖片,其實(shí)那些圖片是可以聯(lián)合成一個(gè)整體的,即:
看這個(gè)圖片,千萬(wàn)不要嫌煩,必須一條線一條線挨著分析。如果上一節(jié)你看的比較仔細(xì),再結(jié)合剛才咱們介紹的instanceof的概念,相信能看懂這個(gè)圖片的內(nèi)容。
看看這個(gè)圖片,你也就知道為何上面三個(gè)看似混亂的語(yǔ)句返回的是true了。
問(wèn)題又出來(lái)了。Instanceof這樣設(shè)計(jì),到底有什么用?到底instanceof想表達(dá)什么呢?
重點(diǎn)就這樣被這位老朋友給引出來(lái)了——繼承——原型鏈。
即,instanceof表示的就是一種繼承關(guān)系,或者原型鏈的結(jié)構(gòu)。請(qǐng)看下節(jié)分解。
(注:本節(jié)的圖片來(lái)源于http://www.ibm.com/developerworks/cn/web/1306_jiangjj_jsinstanceof/figure1.jpg )
更多建議: