學(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é)果如下圖所示:

剛才不是說(shuō)函數(shù)是對(duì)象嗎?它們的proto為啥不一樣?往下看,別著急。
var A = function () {};
var B ={};
console.log(A.__proto__.__proto__)
console.log(B.__proto__)
console.log結(jié)果如下:

是不是一樣了,,確實(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é)果如下:

對(duì)象并不具有prototype屬性,只有函數(shù)才有prototype屬性。這就證明聲明2的說(shuō)法是正確的。
總結(jié):
- js里所有的對(duì)象都有proto屬性(對(duì)象,函數(shù)),指向構(gòu)造該對(duì)象的構(gòu)造函數(shù)的原型。
- 只有函數(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)手敲代碼,敲著敲著就明白了。