原 型:相同對象的共有屬性也稱做原型函數
原型鏈:中全部的對象都是由它的原型對象繼承而來。而原型對象自身也是一個對象,它也有本身的原型對象,這樣層層上溯,就造成了一個相似鏈表的結構,這就是原型鏈
spa
在JS中,不一樣類型對象都有各自相同類型共有的屬性,也有所有對象共有的屬性,若是每一個對象的屬性都單獨出來,會很是浪費資源,prototype
var a = new String('a'); var b = new Number(1); var c = new Boolean(true); //能夠發現,無論是字符串仍是數值仍是布爾,它們都有toString()屬性 a.toString ƒ toString() { [native code] } b.toString ƒ toString() { [native code] } c.toString ƒ toString() { [native code] }
因此JS將公共的屬性單獨出來【如所有對象共用屬性valueOf() ,toString()】,JS經過__proto__ 來指向每一個類型對象的公共屬性。好比,有五個string對象五個number對象,每一個對象的值都是不一樣的,但對象類型都是同樣的。code
var a = new Number(1) var b = new Number(2) //雖然變量a和b的值不一樣,可是它們共有的屬性都是__proto__: Number console.log(a) Number {1} __proto__: Number [[PrimitiveValue]]: 1 console.log(b) Number {2} __proto__: Number [[PrimitiveValue]]: 2
string對象和number對象都有本身私有屬性(指相同對象類型的私有屬性),每一個對象的__proto__都指向本身相同對象類型的私有屬性,相同對象類型的私有屬性也有本身的__proto__,它指向的是所有對象共有的屬性。__proto__: Number下面的__proto__又指向了所有對象共有的屬性。
對象
所有對象共有的屬性,沒有__proto__屬性,它指向的是null,經過下面截圖看出普通的object對象__proto__下的屬性已經沒有__proto__指到其餘地方了。blog
說的直白點就是,全部原型鏈的__proto__屬性,最終都指向的是object對象的__proto__而object對象的__proto__指向的是null。
繼承
var 對象 = new 函數() 對象.__proto__ === 對象的構造函數.prototype // 推論 var number = new Number() number.__proto__ = Number.prototype var object = new Object() object.__proto__ = Object.prototype var function = new Function() function.__proto__ = Function.prototype // 另外,全部函數都是由 Function 構造出來的,因此 Number.__proto__ = Function.prototype // 由於 Number 是函數,是 Function 的實例 Object.__proto__ = Function.prototype // 由於 Object 是函數,是 Function 的實例 Function.__proto__ == Function.prototye // 由於 Function 是函數,是 Function 的實例!