JavaScript中__proto__與prototype的關係

瞭解JavaScript中原型以及原型鏈只須要記住如下2點便可javascript

  • 對象都有__proto__屬性,指向構造函數的prototype
  • 構造函數\函數都有prototype屬性,指向構造函數的原型

一、對象的__proto__

  • 內置構造函數
Number.__proto__ === Function.prototype  // true
Boolean.__proto__ === Function.prototype // true
String.__proto__ === Function.prototype  // true
Object.__proto__ === Function.prototype  // true
Function.__proto__ === Function.prototype // true
Array.__proto__ === Function.prototype   // true
RegExp.__proto__ === Function.prototype  // true
Error.__proto__ === Function.prototype   // true
Date.__proto__ === Function.prototype    // true

可知全部的構造函數都繼承於Function.prototype , 甚至包括根構造器Object及Function自身。全部構造器都繼承了Function.prototype的屬性及方法,如length、call、apply、bind等。java

既然全部的構造器都來自於Function.prototype, 那麼Function.prototype 是什麼呢?app

Object.prototype.toString.call(Function.prototype)

"[object Function]"

Function.prototype();
 //undefined

Function.prototype 是函數,是否是很意外!!!函數

既然 Function.prototype 是函數,那麼它就是 Function 的實例,然而並非這樣的!!!spa

Function.prototype.__proto__ === Function.prototype // false

Function.prototype.__proto__ === Object.prototype // true

如何理解 Function.prototype 不是 Function 實例的怪異行爲呢?解決怪異行爲的根本方法是讓它顯得不那麼怪異,看下面代碼。prototype

Object.prototype.toString.call(Number.prototype)
"[object Number]"

Number.prototype.__proto__ === Number.prototype // false
Number.prototype.__proto__ === Object.prototype // true

Object.prototype.toString.call(String.prototype)
"[object String]"

String.prototype.__proto__ === String.prototype // false
String.prototype.__proto__ === Object.prototype // true

Object.prototype.toString.call(Array.prototype)
"[object Array]"

Number.prototype.__proto__ === Array.prototype // false
Number.prototype.__proto__ === Object.prototype // true

簡單理解:內置構造函數的數據類型是對應的構造函數,但不是其對應構造函數的實例,而是Object的實例。code

二、函數的prototype

構造函數\函數都有prototype屬性,指向構造函數函數的原型,原型有constructor屬性,指向構造函數\函數對象

  • 構造函數
Number.prototype.constructor === Number
// true

Function.prototype.constructor === Function
//true

Object.prototype.constructor === Object
true
  • 普通函數
function wang(){};

wang.prototype.constructor === wang

//true

關係圖

圖片描述

相關文章
相關標籤/搜索