JavaScript中的顯示原型和隱形原型(理解原型鏈)

  • 2019 年 10 月 4 日
  • 筆記

顯式原型:prototype

隱式原型:__proto__

1.顯式原型和隱式原型是什麼?

在js中萬物皆對象,方法(Function)是對象,方法的原型(Function.prototype)是對象,對象具有屬性(__proto__)稱為隱式原型,對象的隱式原型指向構造該對象的構造函數的顯式原型。

方法(Function)是一個特殊的對象,除了和其他對象一樣具有__proto__屬性以外,它還有一個自己特有的原型屬性(prototype),這個屬性是一個指針,指向原型對象。原型對象也有一個屬性叫constructor,這個屬性包含一個指針,指向原構造函數。

注意:通過Function.prototype.bind方法構造出來的函數沒有prototype屬性。

注意:Object.prototype.這個對象的是個例外,它的__proto__值為null。

2.二者的關係

隱式原型指向創建這個對象的函數的prototype

首先我們來看如何創建一個對象

a.通過對象字面量的方式。

var person={      name:"Tom"  }

b.通過new的方式創建

//創建一個構造函數  function person(name){      this.name=name  }  //創建一個構造函數的實例  var person1=new person;

c.通過Object.creat()方式創建

但是本質上3種方法都是通過new的方式創建的。

其中通過Object.creat(o)創建出來的對象他的隱式原型指向o。

通過對象字面量的方式創建的對象他的隱式原型指向Object.prototype。

構造函數function person本質上是由Function構造函數創建的,它是Function的一個實例。原型對象本質上是由Object構造函數創建的。內置函數Array Number等也是有Function構造函數創建的。

因此也就不難理解下面幾個例子:

//通過new的方式  person1.__proto__===person.prototype //true  person.prototype.__proto__===Object.prototype //true  Object.__proto__===Function.prototype //true  //內置函數  Array.__proto__===Function.prototype //true  Array.prototype.__proto__===Object.prototype //true

Function的__proto__指向其構造函數Function的prototype;

Object作為一個構造函數(是一個函數對象!!函數對象!!),所以他的__proto__指向Function.prototype;

Function.prototype的__proto__指向其構造函數Object的prototype;

Object.prototype的__prototype__指向null(盡頭);