關(guān)于Javascript 的 prototype問題。
更新時間:2007年01月03日 00:00:00 作者:
prototype
1、
prototype是與Clone聯(lián)系起來的,
也就是說,當(dāng)創(chuàng)建實例時,prototype會把成員clone到該Class(function)的實例上。
Detail: 最常見的幾個內(nèi)置內(nèi)對象里的prototype,如:Array原型有join, split方法,
當(dāng)創(chuàng)建數(shù)組a時var a=[1,2],原型里的所有方法都被clone到a上。
2、this是該類的實例指針(該指針為"動態(tài)聯(lián)編")。如何理解js this的動態(tài)聯(lián)編,請參考我寫的這篇文章:http://blog.never-online.net/article.asp?id=117
當(dāng)創(chuàng)建該類實例時,實例具有預(yù)先定義的所有以this.p類似的成員。也具有prototype原型里定義的成員,如果類內(nèi)部定義與prototype里的一個定義相同,則不是重寫:
看這個例子,jsclass定義的this.func,還有prototype里定義的func,如果jsclass內(nèi)部有成員與原型里的相同,實例化時優(yōu)先權(quán)為this.func,但注意,原型里并不是重寫func,而是jsclass實例共有的,雖然其優(yōu)先權(quán)沒有this.func高,與此同時,我們也可以以這種方式來理解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>
我們再把上面的代碼修改一下。這樣看:
<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 實例名.成員名來刪除的。
如果用prototype定義后,實例化時:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象
也就是在上面的
delete a.func;//此處刪除是的類內(nèi)部定義的func
a.func();//調(diào)用prototype成員
之后,再次調(diào)用a.func(),調(diào)用時,通過調(diào)用prototype.func來實現(xiàn)的。而并非a.func(),這也解釋了為什么在jsclass內(nèi)部定義func與在prototype定義func時不會有重寫現(xiàn)象。
1、
prototype是與Clone聯(lián)系起來的,
也就是說,當(dāng)創(chuàng)建實例時,prototype會把成員clone到該Class(function)的實例上。
Detail: 最常見的幾個內(nèi)置內(nèi)對象里的prototype,如:Array原型有join, split方法,
當(dāng)創(chuàng)建數(shù)組a時var a=[1,2],原型里的所有方法都被clone到a上。
2、this是該類的實例指針(該指針為"動態(tài)聯(lián)編")。如何理解js this的動態(tài)聯(lián)編,請參考我寫的這篇文章:http://blog.never-online.net/article.asp?id=117
當(dāng)創(chuàng)建該類實例時,實例具有預(yù)先定義的所有以this.p類似的成員。也具有prototype原型里定義的成員,如果類內(nèi)部定義與prototype里的一個定義相同,則不是重寫:
看這個例子,jsclass定義的this.func,還有prototype里定義的func,如果jsclass內(nèi)部有成員與原型里的相同,實例化時優(yōu)先權(quán)為this.func,但注意,原型里并不是重寫func,而是jsclass實例共有的,雖然其優(yōu)先權(quán)沒有this.func高,與此同時,我們也可以以這種方式來理解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>
我們再把上面的代碼修改一下。這樣看:
<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 實例名.成員名來刪除的。
如果用prototype定義后,實例化時:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象
也就是在上面的
delete a.func;//此處刪除是的類內(nèi)部定義的func
a.func();//調(diào)用prototype成員
之后,再次調(diào)用a.func(),調(diào)用時,通過調(diào)用prototype.func來實現(xiàn)的。而并非a.func(),這也解釋了為什么在jsclass內(nèi)部定義func與在prototype定義func時不會有重寫現(xiàn)象。
相關(guān)文章
javascript 獲取元素位置的快速方法 getBoundingClientRect()
有一種快速獲得網(wǎng)頁元素的位置。那就是使用getBoundingClientRect()方法。2009-11-11JavaScript實現(xiàn)一個前端會魔法的旋轉(zhuǎn)魔方相冊
星光不問趕路人,時光不誤有心人,牛牛最近學(xué)到了一個神奇的旋轉(zhuǎn)魔方,今天就來分享給大家吧,希望大家能喜歡2022-06-06ionic進(jìn)入多級目錄后隱藏底部導(dǎo)航欄(tabs)的完美解決方案
這篇文章主要介紹了ionic進(jìn)入多級目錄后隱藏底部導(dǎo)航欄(tabs)的完美解決方案,在文章中用到了angularjs的指令知識點,對ionic隱藏底部導(dǎo)航欄知識感興趣的朋友一起學(xué)習(xí)吧2016-11-11ES6 Iterator接口和for...of循環(huán)用法分析
這篇文章主要介紹了ES6 Iterator接口和for...of循環(huán)用法,結(jié)合實例形式分析了Iterator接口和for...of循環(huán)相關(guān)使用技巧,需要的朋友可以參考下2019-07-07JavaScript實現(xiàn)微信號隨機(jī)切換代碼
這篇文章主要介紹了JavaScript實現(xiàn)微信號隨機(jī)切換代碼,需要的朋友可以參考下2018-03-03