當(dāng)聲明一個(gè)對象,那么這個(gè)對象一定要找到一個(gè)公用的屬性互躬,如果沒有公用的屬性播赁,那么這個(gè)對象就沒啥用了,除了存數(shù)據(jù)就沒有其他的價(jià)值了吼渡,有了公用屬性之后容为,就可以調(diào)用各種API。
所有對象都有 toString
和 valueOf
屬性,那么我們是否有必要給每個(gè)對象一個(gè) toString
和 valueOf
呢坎背?
明顯不需要替劈。
JS 的做法是把 toString
和 valueOf
放在一個(gè)對象里(暫且叫做公用屬性組成的對象)
然后讓每一個(gè)對象的 __proto__
存儲這個(gè)「公用屬性組成的對象」的地址。
原型就是公用屬性的意思得滤。
下圖中公用屬性通過__proto__
串起來的像鏈一樣的路線就是原型鏈陨献。
瀏覽器一開始就在內(nèi)存里把原型給初始化好了。如下:
var a = {}
// undefined
var b = {}
// undefined
a === b
// false
a.toString === b.toString
// true
上面代碼能看出懂更,a
和b
是兩個(gè)完全不一樣的對象眨业,嚴(yán)格相等運(yùn)算返回的結(jié)果都是false
,但是兩者的toString
是完全一樣的沮协,因?yàn)閮蓚€(gè)對象的toString
屬性都存在同一個(gè)公用屬性里龄捡。(也就是Object
的原型里)
var a = {}
// undefined
Object.prototype
// {constructor: ?, __defineGetter__: ?, __defineSetter__: ?, hasOwnProperty: ?, __lookupGetter__: ?, …}
a.__proto__ === Object.prototype
// true
上面代碼能看出,Object.prototype
是Object
的公用屬性的引用(不引用就要被回收了)慷暂,a.__proto__
也是Object
的公用屬性的引用聘殖,所以嚴(yán)格相等返回的是true
(必須要用公用屬性)。
var n1 = new Number(1)
// undefined
n1.__proto__ === Number.prototype
// true
n1.__proto__.__proto__ === Object.prototype
// true
上列代碼表示n1
是一個(gè)對象行瑞,但是對象里面是一個(gè)數(shù)值1
就斤,所以n1.__proto__
引用的公共屬性跟Number.prototype
引用的是同樣的屬性,Number.prototype
引用的公用屬性本身里面也有個(gè)__proto__
引用Object.prototype
引用到的公共屬性(具體可以看文章開頭兩幅圖來理解)蘑辑,所以n1.__proto__.__proto__
是與Object.prototype
嚴(yán)格相等的,因?yàn)橐玫亩际峭粋€(gè)公共屬性坠宴。