JavaScript中顯式原型和隱式原型的聯系


 顯式原型: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(盡頭);

 原型圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM