原型與原型鏈學習筆記

原 型:相同對象的共有屬性也稱做原型函數

原型鏈:中全部的對象都是由它的原型對象繼承而來。而原型對象自身也是一個對象,它也有本身的原型對象,這樣層層上溯,就造成了一個相似鏈表的結構,這就是原型鏈
圖片描述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 的實例!
相關文章
相關標籤/搜索