原型 prototype
建構函式.prototype===原型 原型.constuctor===建構函式 例項的__proto__===建構函式.prototype
原型鏈
一個物件的__proto__指向該物件的建構函式的prototype,該建構函式的prototype中有一個__proto__繼續指向該建構函式的原型物件(父類)的prototype,一直到最頂級的原型物件——Object的原型。
屬性查詢機制就是利用了原型鏈,同樣繼承共有成員也是利用了原型和原型鏈。
私有成員即該物件的成員(由new中第三步,Father.call(objInstance)來新增(this.xxx = xxx;))
有趣的地方,啊,無限迴圈的條件必然是有一個等式存在(無限遞迴),不然就是悖論!
Function.__proto__.constructor === Function
Object.__proto__.__proto__.constructor === Object
a = {}
1. a.__proto__ === Object.prototype
b = new Foo()
1. b.__proto__ === Foo.prototype
2. b.__proto__.__proto__ === Foo.prototype.__proto__ === Object.prototype (did u find it ? b not find the prototyperty of Function in find prototypeChain.)
but
Foo.__proto__ === Function.prototype
Object.__proto__ === Function.prototype === Function.__proto__
Function.__proto__ === Function.prototype
Foo.__proto__ === Function.__proto__ === Object.__proto__
Function.prototype .__proto === Object.prototype === Object.__proto__.__proto__ === Foo.__proto__._proto__
Object.prototype.__proto__ === null.
so
- a.__proto.__proto === null
- Function.__proto__.__proto__ === Object.prototype
- Object.__proto__.__proto__ === Object.prototype
- Foo成員尋找比b多了一層Function.prototype
Object.prototype === Object.__proto__.__proto__ === function(){} (一個沒有prototype的匿名函式)
There is a special Function that don't have property of prototype. And this Function is the end of 原型鏈(prototypeChain), cause its __proto__ === null.
查詢
查詢物件屬性時,根據__proto__一級級向上查詢,遞迴的終點是null,即上面的Object.prototype.__proto.
建構函式
一個用於new例項物件的函式物件叫做建構函式。
new做了什麼
- 建立一個空物件
- 將父類的prototype賦給空物件的__proto__(原型的繼承)
- 使用call讓空物件執行父類建構函式
- 返回這個物件
繼承
一個經典的問題,傳統的繼承使用了原型鏈