JavaScript的面向?qū)ο?一)
更新時(shí)間:2006年11月09日 00:00:00 作者:
一。傳統(tǒng)的基于原型(Prototype)的做法
確切地說(shuō)Javascrīpt的“類”在嚴(yán)格意義上來(lái)講并不能算真正的類,從其聲明的對(duì)象到類(估切這么說(shuō))有這樣一個(gè)關(guān)系:
Instance.__proto__=InstanceClass.prototype(ie不支持)
以上說(shuō)明:實(shí)例的屬性(__proto__)等于類的prototpye,我們可以看出,實(shí)例的"__proto__"正好巧接在類的"prototype"上,通過(guò)原型鏈(prototype)來(lái)查找其方法并擴(kuò)展,我們會(huì)發(fā)現(xiàn)其方法(Method)與其屬性(Property)都是Public(當(dāng)然你也可以用Private,即不用this),而prototype其實(shí)就是一對(duì)象,用來(lái)記錄方法做為一個(gè)集合
假設(shè)我們聲明一個(gè)類A,可以如此
function A(){
this.className="ClassA"; //添加Public屬性,正確來(lái)說(shuō)類名應(yīng)該是Private的
}
//添加一方法
A.prototype.getClassName=function(){
return this.className; //this指代A,而不是prototype
}
//聲明一對(duì)象
var AObj=new A();
alert(AObj.__proto__==A.prototype); //ie下無(wú)效,ff下為true,說(shuō)明上面的驗(yàn)證是正確的
//我們來(lái)看看對(duì)象屬性
/*
由于用了this,className即為Public,即可以隨意修改或讀取
如果要保護(hù)起來(lái),就要用到Private,那么可以去掉其this前綴,做為保護(hù)
讀的時(shí)候用一公開(kāi)方法,即prototype下的方法:
A.prototype.getClassName=function(){
return className; //行不通,不存在,className是undefined
}
在這兒也只能約定一下,給className加上this,不要去直接去訪問(wèn)。在這一點(diǎn)上,的確不如第二種方法,稍
后會(huì)說(shuō)明
*/
關(guān)于"prototype"
由于Javascrīpt并沒(méi)有在系統(tǒng)內(nèi)部并未使用過(guò)“繼承”(很大可能),所以class下的prototype得到的全是
頂層Object,后期在繼承的時(shí)候,我們可以看到這樣的一個(gè)式子:
child.prototype=new parent();
繼承兩字帶引號(hào)的意思是說(shuō)就算有繼承也并非真正意義上的繼承,也只是通過(guò)prototype巧接得到。
用實(shí)例擴(kuò)展一個(gè)方法到類,這兒不得不提及__proto__這個(gè)屬性
s.__proto__.hjk=function(){
return "hjk";
}
alert(s.hjk());
for(var t in abc.prototype){
alert("prototype指向:"+t+"="+abc.prototype[t]);
}
這下應(yīng)該明白了吧。
確切地說(shuō)Javascrīpt的“類”在嚴(yán)格意義上來(lái)講并不能算真正的類,從其聲明的對(duì)象到類(估切這么說(shuō))有這樣一個(gè)關(guān)系:
Instance.__proto__=InstanceClass.prototype(ie不支持)
以上說(shuō)明:實(shí)例的屬性(__proto__)等于類的prototpye,我們可以看出,實(shí)例的"__proto__"正好巧接在類的"prototype"上,通過(guò)原型鏈(prototype)來(lái)查找其方法并擴(kuò)展,我們會(huì)發(fā)現(xiàn)其方法(Method)與其屬性(Property)都是Public(當(dāng)然你也可以用Private,即不用this),而prototype其實(shí)就是一對(duì)象,用來(lái)記錄方法做為一個(gè)集合
假設(shè)我們聲明一個(gè)類A,可以如此
function A(){
this.className="ClassA"; //添加Public屬性,正確來(lái)說(shuō)類名應(yīng)該是Private的
}
//添加一方法
A.prototype.getClassName=function(){
return this.className; //this指代A,而不是prototype
}
//聲明一對(duì)象
var AObj=new A();
alert(AObj.__proto__==A.prototype); //ie下無(wú)效,ff下為true,說(shuō)明上面的驗(yàn)證是正確的
//我們來(lái)看看對(duì)象屬性
/*
由于用了this,className即為Public,即可以隨意修改或讀取
如果要保護(hù)起來(lái),就要用到Private,那么可以去掉其this前綴,做為保護(hù)
讀的時(shí)候用一公開(kāi)方法,即prototype下的方法:
A.prototype.getClassName=function(){
return className; //行不通,不存在,className是undefined
}
在這兒也只能約定一下,給className加上this,不要去直接去訪問(wèn)。在這一點(diǎn)上,的確不如第二種方法,稍
后會(huì)說(shuō)明
*/
關(guān)于"prototype"
由于Javascrīpt并沒(méi)有在系統(tǒng)內(nèi)部并未使用過(guò)“繼承”(很大可能),所以class下的prototype得到的全是
頂層Object,后期在繼承的時(shí)候,我們可以看到這樣的一個(gè)式子:
child.prototype=new parent();
繼承兩字帶引號(hào)的意思是說(shuō)就算有繼承也并非真正意義上的繼承,也只是通過(guò)prototype巧接得到。
用實(shí)例擴(kuò)展一個(gè)方法到類,這兒不得不提及__proto__這個(gè)屬性
復(fù)制代碼 代碼如下:
<scrīpt LANGUAGE="Javascrīpt">
<!--
function abc(){
var ōwner=this;
owner.k="pp";
owner.abc=function(){
}
}
abc.prototype.def=function(){
}
var s=new abc();
for(var t in abc.prototype){
alert("prototype指向:"+t+"="+abc.prototype[t]);
}
for(var t in s.__proto__){
alert("__proto__指向:"+t+"="+s.__proto__[t]);
}
//-->
</scrīpt>
在ff下我看可以看到實(shí)例名.__proto__=類.prototype,現(xiàn)在通過(guò)實(shí)例擴(kuò)展一個(gè)方法,這兒在實(shí)際應(yīng)用當(dāng)中并不推薦這樣做,下例: <!--
function abc(){
var ōwner=this;
owner.k="pp";
owner.abc=function(){
}
}
abc.prototype.def=function(){
}
var s=new abc();
for(var t in abc.prototype){
alert("prototype指向:"+t+"="+abc.prototype[t]);
}
for(var t in s.__proto__){
alert("__proto__指向:"+t+"="+s.__proto__[t]);
}
//-->
</scrīpt>
s.__proto__.hjk=function(){
return "hjk";
}
alert(s.hjk());
for(var t in abc.prototype){
alert("prototype指向:"+t+"="+abc.prototype[t]);
}
這下應(yīng)該明白了吧。
相關(guān)文章
JavaScript樹(shù)形數(shù)據(jù)結(jié)構(gòu)處理
這篇文章主要介紹了JavaScript樹(shù)形數(shù)據(jù)結(jié)構(gòu)處理,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07JavaScript 變量,數(shù)據(jù)類型基礎(chǔ)實(shí)例詳解【變量、字符串、數(shù)組、對(duì)象等】
這篇文章主要介紹了JavaScript 變量,數(shù)據(jù)類型基礎(chǔ),結(jié)合實(shí)例形式詳細(xì)分析了JavaScript變量聲明、字符串、數(shù)組、對(duì)象等基本使用方法與操作注意事項(xiàng),需要的朋友可以參考下2020-01-01Javascript 淺拷貝、深拷貝的實(shí)現(xiàn)代碼
Javascript中的對(duì)像賦值與Java中是一樣的,都為引用傳遞.就是說(shuō),在把一個(gè)對(duì)像賦值給一個(gè)變量時(shí),那么這個(gè)變量所指向的仍就是原來(lái)對(duì)像的地址.那怎么來(lái)做呢 答案是克隆.2008-12-12js模仿微信朋友圈計(jì)算時(shí)間顯示幾天/幾小時(shí)/幾分鐘/幾秒之前
本篇文章主要介紹了js模仿微信朋友圈計(jì)算時(shí)間顯示幾天/幾小時(shí)/幾分鐘/幾秒之前的實(shí)例。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04通過(guò)location.replace禁止瀏覽器后退防止重復(fù)提交
如果用戶重復(fù)提交事件,然后又后退,這樣可能會(huì)對(duì)某些數(shù)據(jù)產(chǎn)生災(zāi)難性的問(wèn)題。所以今天就向大家介紹一種通過(guò)location.replace禁止瀏覽器后退按鈕的方法2014-09-09javascript下數(shù)值型比較難點(diǎn)說(shuō)明
下面兩個(gè)小問(wèn)題是樓豬在實(shí)際項(xiàng)目開(kāi)發(fā)中遇到的,貼上來(lái)和大家討論下。2010-06-06JavaScript獲取時(shí)間戳的方法總結(jié)
JavaScript獲得時(shí)間戳的方法有五種,后四種都是通過(guò)實(shí)例化時(shí)間對(duì)象new Date() 來(lái)進(jìn)一步獲取當(dāng)前的時(shí)間戳,下面我們就一起學(xué)習(xí)一下具體獲取的方法吧2023-09-09