完全搞懂js裏的__proto__和prototype到底有什麼區別?

1.在JS裏,萬物皆對象。方法(Function)是對象,方法的原型(Function.prototype)是對象。所以,它們都會具備對象共有的特色。即:對象具備屬性proto,可稱爲隱式原型,一個對象的隱式原型指向構造該對象的構造函數的原型,這也保證了實例可以訪問在構造函數原型中定義的屬性和方法。
2.方法(Function)方法這個特殊的對象,除了和其餘對象同樣有上述proto屬性以外,還有本身特有的屬性——原型屬性(prototype),這個屬性是一個指針,指向一個對象,這個對象的用途就是包含全部實例共享的屬性和方法(咱們把這個對象叫作原型對象)。原型對象也有一個屬性,叫作constructor,這個屬性包含了一個指針,指回原構造函數。
1.1
首先聲明一個對象和一個函數,console.log一下對象和函數的proto
var A = function () {};
var B ={};函數

console.log(A.__proto__)
console.log(B.__proto__)
控制檯輸出結果以下圖所示:
圖片描述spa

剛纔不是說函數是對象嗎?它們的proto爲啥不同?往下看,彆着急。
var A = function () {};
var B ={};
console.log(A.__proto__.__proto__)
console.log(B.__proto__)
console.log結果以下:
圖片描述prototype

是否是同樣了,,確實有點懵逼啊。。重點 隱式原型指向構造該對象的構造函數的原型。由於function是特殊的對象,A.proto就指向了構造該函數的一個函數(隨意起個名字 C),C的proto就指向了和B對象同樣的proto。。我本身都懵逼了。
1.2一個對象和一個函數,console.log一下對象和函數的prototype
var A = function () {};
var B ={};
console.log(A.prototype)
console.log(B.prototype)
console.log結果以下:
圖片描述3d

對象並不具備prototype屬性,只有函數纔有prototype屬性。這就證實聲明2的說法是正確的。
總結:
js裏全部的對象都有proto屬性(對象,函數),指向構造該對象的構造函數的原型。
只有函數function才具備prototype屬性。這個屬性是一個指針,指向一個對象,這個對象的用途就是包含全部實例共享的屬性和方法(咱們把這個對象叫作原型對象)。原型對象也有一個屬性,叫作constructor,這個屬性包含了一個指針,指回原構造函數。指針

相關文章
相關標籤/搜索