日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

我所知的javascript之prototype

發(fā)布時間:2023/12/9 javascript 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我所知的javascript之prototype 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一:prototype大概概念和用途“prototype”字面翻譯是“原型”,是javascript實現(xiàn)繼承的主要手段。粗略來說就是:prototype是javascript中的函數(shù)(function)的一個保留屬性,并且它的值是一個對象(我們可以稱這個對象為"prototype對象"),通過以此函數(shù)作為構(gòu)造函數(shù)構(gòu)造出來的對象都自動的擁有構(gòu)造函數(shù)的prototype對象的成員屬性和方法。其中的要點是:1.prototype是函數(shù)(function)的一個必備屬性(書面一點的說法是"保留屬性")(只要是function,就一定有一個prototype屬性)2.prototype的值是一個對象3.可以任意修改函數(shù)的prototype屬性的值。4.一個對象會自動擁有這個對象的構(gòu)造函數(shù)的prototype的成員屬性和方法例子代碼://定義一個函數(shù)(構(gòu)造函數(shù)),并定義一些屬性和方法用來給另外一個構(gòu)造函數(shù)構(gòu)造出來的對象繼承
var?function1=function(){
????this.name="function1";
????this.saySomething=function(){alert("This's?a?method?of?"+this.name);}//定義一個方法
}

//定義另外一個構(gòu)造函數(shù)
var?function2=function(){
? ??
}

function2.prototype=new?function1();//將構(gòu)造函數(shù)function2的prototype屬性設(shè)置為一個由function1構(gòu)造出來的對象,以便使由function2構(gòu)造出來的對象(并且原本是沒有任何屬性和方法的對象)擁有function1的屬性和方法
var?obj1=new?function1();
obj1.saySomething();//obj1本來什么成員也沒有,多得prototype機制,是它坐享其成地?fù)碛辛薴unction1對象的屬性和方法。當(dāng)然,上述例子離真正實際上使用的“繼承”還相差甚遠(yuǎn),但也體現(xiàn)出繼承的意義:一個對象擁有了另一個對象的屬性和方法。(如兒子擁有了老爸的血型和脾氣,人類繼承了動物的本能如進食和打斗等等)

?

二:prototype的背后發(fā)生了什么?以上部分大概闡述了prototype的概念和作用,但單憑這些還不夠?qū)rototype加深認(rèn)識。現(xiàn)在來看看prototype背后是怎樣工作的:先來看看用new形式創(chuàng)建對象的過程:var obj=new func();//以func()作為構(gòu)造函數(shù)創(chuàng)建一個對象obj這個過程是這樣的:javascript引擎首先遇到了關(guān)鍵字new后,馬上開辟了一塊內(nèi)存,創(chuàng)建了一個空對象(并且將this指向這個對象),接著執(zhí)行構(gòu)造函數(shù)func()對這個空對象進行構(gòu)造(構(gòu)造函數(shù)里面有什么屬性和方法都一一給這個空白對象裝配上去,這也就是為什么構(gòu)造函數(shù)叫“構(gòu)造函數(shù)”的原因)其實,new和執(zhí)行構(gòu)造函數(shù)之間還有一件事引擎沒有顯式地告訴我們,而是偷偷地做了,這就是給這個空對象賦予prototype對象。這里不得不提到一個跟prototype一樣同樣是系統(tǒng)保留而且同樣重要的東西:__proto____proto__是一個對象自動擁有的內(nèi)置屬性(請注意:prototype是函數(shù)的內(nèi)置屬性,__proto__是對象的內(nèi)置屬性,但它們最終都指向同一個對象,就是那個用來被繼承的對象),用chrome和FF都可以訪問到一個對象的__proto__屬性,IE就不可以。正是一個對象的__proto__指向著這個對象的構(gòu)造函數(shù)的prototype對象,才使這個對象認(rèn)識了它的構(gòu)造函數(shù)的prototype對象,并擁有了這個prototype對象的屬性和方法。所以var obj=new func()這個過程更具體是這樣的:1.javascript解析引擎遇到new后,開辟一片內(nèi)存并創(chuàng)建了一個空對象,并且將“this”指向這個空對象2.javascript解析引擎將這個空對象的__proto__指向后面緊跟著的構(gòu)造函數(shù)默認(rèn)的prototype對象(一指向到prototype對象后,解析引擎就知道了“噢,這個對象要擁有這個prototype對象的屬性和方法了”)3.javascript解析引擎執(zhí)行構(gòu)造函數(shù)體內(nèi)的代碼,也就正式開始對這個空對象進行構(gòu)造(或者說裝配)的過程了(this.name="xxx",this.sayHello=function(){...}等等)4.對象被構(gòu)造裝配好,并賦值到等號左邊的變量。三:后記我在嘗試比較js中使用call與prototype實現(xiàn)繼承的優(yōu)缺點的過程中曾遇到過一個問題,并在csdn論壇上求助過,有興趣的可以點擊看一下http://topic.csdn.net/u/20111119/12/c40f4674-6142-4c4a-a532-9580f2baed8d.html,這是這個問題使我加速了對prototype的了解。在此多謝一下為我解答的liangws。正如本文題目所說的,這些都是“我所知的javascript”,由于本人水平有限,本文描述肯定有不正確的地方,所以僅供參考,如發(fā)現(xiàn)有錯誤的地方歡迎拍磚。

轉(zhuǎn)載于:https://www.cnblogs.com/lwhkdash/archive/2011/11/23/2260051.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的我所知的javascript之prototype的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。