把 js 程式碼看成是執行在 v8 環境裡的物件
這個環境只有一個初始物件,Object,它同時也是 js 裡的函式
環境有 4 個規則:
-
js 函式必有
.prototype
引用,它的目的是,為由該函式建立出來的例項,提供一個引用(__proto__
),能訪問到定義在該函式的 prototype 上的屬性(簡單來說就是為 js 實現例項化或繼承而服務,覺得繞口直接看 2) -
若物件 a 由物件 A 創造而來(
a = new A()
),則有a.__proto__ === A.prototype
-
所有 js 函式都是由
Function.prototype
創造而來 -
所有 js 函式的
prototype
都是Object.prototype
創造而來,由於Object
是 v8 環境自帶的初始化物件,即使它是個函式,但Object.prototype
並不由Object.prototype
創造
由於 Object 和 Function 都是函式,根據上面的規則,可以得到:
-
Object.__proto__ === Function.prototype
(規則 3) -
Function.__proto__ === Function.prototype
(規則 3) -
A = function(){},則 A.__proto__ === Function.prototype
(規則 3) -
Function.prototype.__proto__ === Object.prototype
(規則 4) -
Object.prototype.__proto__ === null
(規則 4) -
若
A = function() {}
,等價於A = new Function()
;然後a = new A()
。 則有a.__proto__.__proto___ === A.prototype.__proto___ === Object.prototype
(規則 4)