關(guān)于Javascript 的 prototype問題。
1、
prototype是與Clone聯(lián)系起來的,
也就是說,當(dāng)創(chuàng)建實(shí)例時(shí),prototype會(huì)把成員clone到該Class(function)的實(shí)例上。
Detail: 最常見的幾個(gè)內(nèi)置內(nèi)對(duì)象里的prototype,如:Array原型有join, split方法,
當(dāng)創(chuàng)建數(shù)組a時(shí)var a=[1,2],原型里的所有方法都被clone到a上。
2、this是該類的實(shí)例指針(該指針為"動(dòng)態(tài)聯(lián)編")。如何理解js this的動(dòng)態(tài)聯(lián)編,請(qǐng)參考我寫的這篇文章:http://blog.never-online.net/article.asp?id=117
當(dāng)創(chuàng)建該類實(shí)例時(shí),實(shí)例具有預(yù)先定義的所有以this.p類似的成員。也具有prototype原型里定義的成員,如果類內(nèi)部定義與prototype里的一個(gè)定義相同,則不是重寫:
看這個(gè)例子,jsclass定義的this.func,還有prototype里定義的func,如果jsclass內(nèi)部有成員與原型里的相同,實(shí)例化時(shí)優(yōu)先權(quán)為this.func,但注意,原型里并不是重寫func,而是jsclass實(shí)例共有的,雖然其優(yōu)先權(quán)沒有this.func高,與此同時(shí),我們也可以以這種方式來理解prototype與類內(nèi)部定義成員:
<script>
function jsclass() {
this.p = "never-online";
this.func = function () {
alert('func');
}
}
jsclass.prototype = {
func : function () {
alert(this.p);
}
}
var a = new jsclass();
a.func();
delete a.func;
a.func();
</script>
我們?cè)侔焉厦娴拇a修改一下。這樣看:
<script>
function jsclass() {
this.p = "never-online";
this.func = function () {
alert('func');
}
}
jsclass.prototype = {
func : function () {
alert(this.p?this.p:'no value');
}
}
var a = new jsclass();
a.func();//調(diào)用內(nèi)部成員
delete a.func;//此處刪除是的類內(nèi)部定義的func
a.func();//調(diào)用prototype成員
delete a.func;//試圖再次刪除func(prototype)
a.func();//刪除無效(內(nèi)部的func已經(jīng)被刪除),依然可打印輸出
</script>
注釋:類內(nèi)部的成員可以用delete刪除,而原型里定義的,則不能用delete 實(shí)例名.成員名來刪除的。
如果用prototype定義后,實(shí)例化時(shí):用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型創(chuàng)建新的對(duì)象
也就是在上面的
delete a.func;//此處刪除是的類內(nèi)部定義的func
a.func();//調(diào)用prototype成員
之后,再次調(diào)用a.func(),調(diào)用時(shí),通過調(diào)用prototype.func來實(shí)現(xiàn)的。而并非a.func(),這也解釋了為什么在jsclass內(nèi)部定義func與在prototype定義func時(shí)不會(huì)有重寫現(xiàn)象。
相關(guān)文章
詳解Python中l(wèi)ogging日志模塊在多進(jìn)程環(huán)境下的使用
許多應(yīng)用程序中都會(huì)有日志模塊,用于記錄系統(tǒng)在運(yùn)行過程中的一些關(guān)鍵信息,以便于對(duì)系統(tǒng)的運(yùn)行狀況進(jìn)行跟蹤。這篇文章給大家主要介紹了在Python中l(wèi)ogging日志模塊在多進(jìn)程環(huán)境下的使用,需要的朋友可以參考借鑒,下面來一起看看吧。2016-12-12
js 復(fù)制或插入Html的實(shí)現(xiàn)方法小結(jié)
很多情況下是用innerHTML或innerText,現(xiàn)在比較流行直接的dom操作,大家可以根據(jù)需要選擇。2010-05-05
深入理解JavaScript系列(15) 函數(shù)(Functions)
本章節(jié)我們要著重介紹的是一個(gè)非常常見的ECMAScript對(duì)象——函數(shù)(function),我們將詳細(xì)講解一下各種類型的函數(shù)是如何影響上下文的變量對(duì)象以及每個(gè)函數(shù)的作用域鏈都包含什么,以及回答諸如像下面這樣的問題:下面聲明的函數(shù)有什么區(qū)別么2012-04-04
JavaScript實(shí)現(xiàn)body內(nèi)任意節(jié)點(diǎn)的自定義屬性功能示例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)body內(nèi)任意節(jié)點(diǎn)的自定義屬性功能,涉及javascript針對(duì)DOM節(jié)點(diǎn)的獲取及屬性設(shè)置相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
微信小程序 動(dòng)態(tài)綁定數(shù)據(jù)及動(dòng)態(tài)事件處理
這篇文章主要介紹了微信小程序 動(dòng)態(tài)綁定數(shù)據(jù)及動(dòng)態(tài)事件處理的相關(guān)資料,需要的朋友可以參考下2017-03-03
layui使用數(shù)據(jù)表格實(shí)現(xiàn)購物車功能
這篇文章主要為大家詳細(xì)介紹了layui使用數(shù)據(jù)表格實(shí)現(xiàn)購物車功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
JavaScript判斷圖片是否已經(jīng)加載完畢的方法匯總
在網(wǎng)上有很多關(guān)于判斷圖片是否已經(jīng)加載完畢的文章,但是有的瀏覽器并不適合,下面小編給大家分享一些有關(guān)JavaScript判斷圖片是否已經(jīng)加載完畢的方法匯總,需要的朋友參考下2016-02-02
Javascript 實(shí)現(xiàn)的數(shù)獨(dú)解題算法網(wǎng)頁實(shí)例
此算法的實(shí)現(xiàn),就是模擬人腦的思考和計(jì)算過程,有需要的朋友可以參考一下2013-10-10

