js里的__proto__和prototype到底有什么區(qū)別?

學(xué)了這么多年前端,一直搞不明白proto和prototype的區(qū)別,實(shí)在慚愧,是時(shí)候總結(jié)一下了。。以下是學(xué)習(xí)時(shí)的記錄,若有錯(cuò)誤之處,請(qǐng)指出。。

首先聲明:

1.在JS里,萬(wàn)物皆對(duì)象。方法(Function)是對(duì)象,方法的原型(Function.prototype)是對(duì)象。因此,它們都會(huì)具有對(duì)象共有的特點(diǎn)。即:<strong>對(duì)象具有屬性proto,可稱(chēng)為隱式原型,一個(gè)對(duì)象的隱式原型指向構(gòu)造該對(duì)象的構(gòu)造函數(shù)的原型,這也保證了實(shí)例能夠訪問(wèn)在構(gòu)造函數(shù)原型中定義的屬性和方法。</strong>

2.方法(Function)方法這個(gè)特殊的對(duì)象,除了和其他對(duì)象一樣有上述proto屬性之外,還有自己特有的屬性——原型屬性(prototype),這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,這個(gè)對(duì)象的用途就是包含所有實(shí)例共享的屬性和方法(我們把這個(gè)對(duì)象叫做原型對(duì)象)。原型對(duì)象也有一個(gè)屬性,叫做constructor,這個(gè)屬性包含了一個(gè)指針,指回原構(gòu)造函數(shù)。

<strong>1.1</strong>首先聲明一個(gè)對(duì)象和一個(gè)函數(shù),console.log一下對(duì)象和函數(shù)的proto

var A = function () {};
var B ={};

console.log(A.__proto__)
console.log(B.__proto__)

控制臺(tái)輸出結(jié)果如下圖所示:

__proto__

剛才不是說(shuō)函數(shù)是對(duì)象嗎?它們的proto為啥不一樣?往下看,別著急。

var A = function () {};
var B ={};
console.log(A.__proto__.__proto__)
console.log(B.__proto__)

console.log結(jié)果如下:

image.png

是不是一樣了,,確實(shí)有點(diǎn)懵逼啊。。重點(diǎn) <strong>隱式原型指向構(gòu)造該對(duì)象的構(gòu)造函數(shù)的原型</strong>。因?yàn)閒unction是特殊的對(duì)象,A.proto就指向了構(gòu)造該函數(shù)的一個(gè)函數(shù)(隨意起個(gè)名字 C),C的proto就指向了和B對(duì)象一樣的proto。。我自己都懵逼了。

<strong>1.2</strong>一個(gè)對(duì)象和一個(gè)函數(shù),console.log一下對(duì)象和函數(shù)的prototype

var A = function () {};
var B ={};
console.log(A.prototype)
console.log(B.prototype)

console.log結(jié)果如下:


image.png

對(duì)象并不具有prototype屬性,只有函數(shù)才有prototype屬性。這就證明聲明2的說(shuō)法是正確的。

總結(jié):

  1. js里所有的對(duì)象都有proto屬性(對(duì)象,函數(shù)),指向構(gòu)造該對(duì)象的構(gòu)造函數(shù)的原型。
  2. 只有函數(shù)function才具有prototype屬性。這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,這個(gè)對(duì)象的用途就是包含所有實(shí)例共享的屬性和方法(我們把這個(gè)對(duì)象叫做原型對(duì)象)。原型對(duì)象也有一個(gè)屬性,叫做constructor,這個(gè)屬性包含了一個(gè)指針,指回原構(gòu)造函數(shù)。

參考這篇文章

剛開(kāi)始看實(shí)在太繞了,有時(shí)候自己把自己都繞進(jìn)去了,多動(dòng)手敲代碼,敲著敲著就明白了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容