undefined console.log(b.x);// --> [object Object] 上面的例子看似簡單,但結(jié)果并不好了解,很容易把人們給想繞了——a.x不是指向?qū)ο骯了么?為" />
輸出undefined;這時(shí)候發(fā)生了這個(gè)事情——a指向的對象{n:1}新增了屬性x(雖然這個(gè)x是undefined的):
從圖上可以看到,由于b跟a一樣是指向?qū)ο驛的,要表示A的x屬性除了用a.x,自然也可以使用b.x來表示了。
接著,依循“從右往左”的賦值運(yùn)算順序先執(zhí)行 a={n:2} ,這時(shí)候,a指向的對象發(fā)生了改變,變成了新對象{n:2}(我們稱為對象B):
接著繼續(xù)執(zhí)行 a.x=a,很多人會認(rèn)為這里是“對象B也新增了一個(gè)屬性x,并指向?qū)ο驜自己”
但實(shí)際上并非如此,由于一開始js已經(jīng)先計(jì)算了a.x,便已經(jīng)解析了這個(gè)a.x是對象A的x,所以在同一條公式的情況下再回來給a.x賦值,也不會說重新解析這個(gè)a.x為對象B的x。
所以 a.x=a 應(yīng)理解為對象A的屬性x指向了對象B:
那么這時(shí)候結(jié)果就顯而易見了。當(dāng)console.log(a.x)的時(shí)候,a是指向?qū)ο驜的,但對象B沒有屬性x。沒關(guān)系,當(dāng)查找一個(gè)對象的屬性時(shí),JavaScript 會向上遍歷原型鏈,直到找到給定名稱的屬性為止。但當(dāng)查找到達(dá)原型鏈的頂部 - 也就是 Object.prototype - 仍然沒有找到指定的屬性B.prototype.x,自然也就
而在console.log(b.x)的時(shí)候,由于b.x表示對象A的x屬性,該屬性是指向?qū)ο驜,自然也輸出了[object Object]了,注意這里的[object Object]可不是2個(gè)對象的意思,對象的字符串形式,是隱式調(diào)用了Object對象的toString()方法,形式是:"[object Object]"。所以[object Object]表示的就只是一個(gè)對象罷了
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com