js prototype和__proto__的關(guān)系是什么
我們創(chuàng)建的每個(gè)函數(shù)都有一個(gè)prototype(原型)屬性,這個(gè)屬性是一個(gè)對(duì)象,它的用途是包含可以由特定類型的所有實(shí)例共享的屬性和方法。(這個(gè)對(duì)象下面有個(gè)屬性,這個(gè)屬性是另外一個(gè)對(duì)象的應(yīng)用 ,這個(gè)屬性就是一個(gè)對(duì)象。)
function是對(duì)象,function的原型prototype也是對(duì)象,它們都會(huì)具有對(duì)象共有的特點(diǎn)。即:對(duì)象具有屬性__proto__,每個(gè)對(duì)象都會(huì)在其內(nèi)部初始化一個(gè)屬性,就是__proto__,當(dāng)我們?cè)L問(wèn)一個(gè)對(duì)象的屬性 時(shí),如果這個(gè)對(duì)象內(nèi)部不存在這個(gè)屬性,那么他就會(huì)去__proto__里找這個(gè)屬性,這個(gè)__proto__又會(huì)有自己的__proto__,于是就這樣 一直找下去,也就是我們平時(shí)所說(shuō)的原型鏈的概念。__proto__可稱為隱式原型,一個(gè)對(duì)象的隱式原型指向構(gòu)造該對(duì)象的構(gòu)造函數(shù)的原型,這也保證了實(shí)例能夠訪問(wèn)在構(gòu)造函數(shù)原型中定義的屬性和方法。
funcition這個(gè)特殊的對(duì)象,除了和其他對(duì)象一樣有上述_proto_屬性之外,還有自己特有的屬性——原型屬性(prototype),這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,這個(gè)對(duì)象的用途就是包含所有實(shí)例共享的屬性和方法(我們把這個(gè)對(duì)象叫做原型對(duì)象)。prototype是通過(guò)調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。使用原型對(duì)象的好處是可以讓所有對(duì)象實(shí)例共享它所包含的屬性和方法,不必在構(gòu)造函數(shù)中定義對(duì)象實(shí)例的信息,而是可以將這些信息直接添加到原型對(duì)象中。原型對(duì)象也有一個(gè)屬性,叫做constructor,這個(gè)屬性包含了一個(gè)指針,指回原構(gòu)造函數(shù)。
ptototype和__proto__聯(lián)系
prototype和__proto__都指向原型對(duì)象,任意一個(gè)函數(shù)(包括構(gòu)造函數(shù))都有一個(gè)prototype屬性,指向該函數(shù)的原型對(duì)象,同樣任意一個(gè)構(gòu)造函數(shù)實(shí)例化的對(duì)象,都有一個(gè)__proto__屬性(__proto__并非標(biāo)準(zhǔn)屬性,ECMA-262第5版將該屬性或指針?lè)Q為[[Prototype]],可通過(guò)Object.getPrototypeOf()標(biāo)準(zhǔn)方法訪問(wèn)該屬性),指向構(gòu)造函數(shù)的原型對(duì)象。---sinのstone
ptototype和__proto__區(qū)別
//a作為構(gòu)造函數(shù)時(shí)的prototype屬性與a作為普通函數(shù)時(shí)的__proto__屬性并不相等 console.log(a.prototype == a.__proto__);//false console.log(a.__proto__); //function (){} console.log(a.__proto__ == Function.prototype);//true //a作為一個(gè)普通函數(shù)調(diào)用時(shí),它的構(gòu)造函數(shù)是內(nèi)置對(duì)象Function,所以它指向的原型對(duì)象,就是Function.prototype. //其實(shí)這個(gè)和console.log(b.__proto__ == a.prototype)是一樣的道理 //a作為構(gòu)造函數(shù)時(shí),它的原型,和它的原型的原型 console.log(a.prototype); //a{} console.log(a.prototype.__proto__); //Object{} //a作為普通函數(shù)時(shí),它原型的原型 console.log(a.__proto__.__proto__); //Object{} console.log(a.__proto__.__proto__ == a.prototype.__proto__); //true
所有對(duì)象都有__proto__屬性,函數(shù)這個(gè)特殊對(duì)象除了具有__proto__屬性,還有特有的原型屬性prototype。prototype對(duì)象默認(rèn)有兩個(gè)屬性,constructor屬性和__proto__屬性。prototype屬性可以給函數(shù)和對(duì)象添加可共享(繼承)的方法、屬性,而__proto__是查找某函數(shù)或?qū)ο蟮脑玩湻绞?。constructor,這個(gè)屬性包含了一個(gè)指針,指回原構(gòu)造函數(shù)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于javascript實(shí)現(xiàn)圖片預(yù)加載
這篇文章主要介紹了javascript圖片預(yù)加載的方法,實(shí)例分析了javascript實(shí)現(xiàn)圖片預(yù)加載的思路,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-01-01innerText和textContent對(duì)比及使用介紹
innerText使用過(guò)程中遇到了FireFox的兼容問(wèn)題FireFox不支持innerText方法但是有個(gè)類似的方法,叫textContent,類似innerText,都是用來(lái)獲?。ㄔO(shè)置)元素中text的方法,感興趣的朋友可以參考下2013-02-02IE6瀏覽器中window.location.href無(wú)效的解決方法
這篇文章主要介紹了IE6瀏覽器中window.location.href無(wú)效的解決方法,給出了正確與錯(cuò)誤的實(shí)例對(duì)比,分析跳轉(zhuǎn)無(wú)效的原因與解決方法,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11純JS實(shí)現(xiàn)的讀取excel文件內(nèi)容功能示例【支持所有瀏覽器】
這篇文章主要介紹了純JS實(shí)現(xiàn)的讀取excel文件內(nèi)容功能,結(jié)合實(shí)例形式分析了基于js相關(guān)插件進(jìn)行Excel文件讀取的相關(guān)操作技巧,需要的朋友可以參考下2018-06-06JavaScript基于DOM操作實(shí)現(xiàn)簡(jiǎn)單的數(shù)學(xué)運(yùn)算功能示例
這篇文章主要介紹了JavaScript基于DOM操作實(shí)現(xiàn)簡(jiǎn)單的數(shù)學(xué)運(yùn)算功能,涉及javascript節(jié)點(diǎn)操作、元素遍歷及數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01js實(shí)現(xiàn)在網(wǎng)頁(yè)上簡(jiǎn)單顯示時(shí)間的方法
這篇文章主要介紹了js實(shí)現(xiàn)在網(wǎng)頁(yè)上簡(jiǎn)單顯示時(shí)間的方法,實(shí)例分析了javascript實(shí)時(shí)顯示時(shí)間的技巧,需要的朋友可以參考下2015-03-03JS和jQuery使用submit方法無(wú)法提交表單的原因分析及解決辦法
這篇文章主要介紹了JS和jQuery使用submit方法無(wú)法提交表單的原因分析及解決辦法的相關(guān)資料,需要的朋友可以參考下2016-05-05如何使用less實(shí)現(xiàn)隨機(jī)下雪動(dòng)畫(huà)詳解
這篇文章主要給大家介紹了關(guān)于如何使用less實(shí)現(xiàn)隨機(jī)下雪動(dòng)畫(huà)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01