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(盡頭);

