用幾條規則解釋關於js原型的所有問題

xilixjd發表於2019-01-27

把 js 程式碼看成是執行在 v8 環境裡的物件

這個環境只有一個初始物件,Object,它同時也是 js 裡的函式

環境有 4 個規則:

  1. js 函式必有 .prototype 引用,它的目的是,為由該函式建立出來的例項,提供一個引用(__proto__),能訪問到定義在該函式的 prototype 上的屬性(簡單來說就是為 js 實現例項化或繼承而服務,覺得繞口直接看 2)

  2. 若物件 a 由物件 A 創造而來(a = new A()),則有 a.__proto__ === A.prototype

  3. 所有 js 函式都是由 Function.prototype 創造而來

  4. 所有 js 函式的 prototype 都是 Object.prototype 創造而來,由於 Object 是 v8 環境自帶的初始化物件,即使它是個函式,但 Object.prototype 並不由 Object.prototype 創造

由於 Object 和 Function 都是函式,根據上面的規則,可以得到:

  1. Object.__proto__ === Function.prototype (規則 3)

  2. Function.__proto__ === Function.prototype (規則 3)

  3. A = function(){},則 A.__proto__ === Function.prototype (規則 3)

  4. Function.prototype.__proto__ === Object.prototype (規則 4)

  5. Object.prototype.__proto__ === null (規則 4)

  6. A = function() {},等價於 A = new Function();然後 a = new A()。 則有 a.__proto__.__proto___ === A.prototype.__proto___ === Object.prototype (規則 4)

相關文章