[JavaScript]原型、原型鏈、建構函式與繼承

蘇水軒發表於2019-02-22

原型 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做了什麼

  1. 建立一個空物件
  2. 將父類的prototype賦給空物件的__proto__(原型的繼承)
  3. 使用call讓空物件執行父類建構函式
  4. 返回這個物件

繼承

一個經典的問題,傳統的繼承使用了原型鏈


相關文章