開(kāi)發(fā)出高質(zhì)量的系統(tǒng)
private variables:原始的定義變量的方法 varprivate functions:通過(guò) var functionName=function(){}聲明
privileged methods: 通過(guò)this.methodName=function(){}聲明privileged properties:通過(guò) this.variableName來(lái)聲明(有些地方把privileged properties叫做public properties,但我感覺(jué)無(wú)論是按照定義寫(xiě)法,還是為了便于理解都叫privileged properties更好些。更便于對(duì)比對(duì)稱(chēng)記憶)
prototype methods :通過(guò)Classname.prototype.methodname=function(){}來(lái)聲明(有些地方叫public method,同樣和上邊一樣的理由,這里改叫prototype method)prototype properties:通過(guò) classname.prototype.propertyName=somevalue來(lái)聲明
static properties: 通過(guò)classname.propertyName=somevalue定義static method :通過(guò)classnamne.methodName來(lái)聲明
說(shuō)明:有些地方(例如我看的文檔中)把privileged properties和prototype method叫成public properties 和public method,不知道為什么這樣叫。這樣命名后造成的問(wèn)題是1,privileged method沒(méi)有對(duì)應(yīng)的privileged properties2,prototype properties沒(méi)有對(duì)應(yīng)的prototype method3,public method和public properties的定義方式又不對(duì)稱(chēng)
下邊解釋一下幾種情況:1,private:定義在類(lèi)內(nèi)部,只能被類(lèi)內(nèi)部的方法調(diào)用,例如privileged(見(jiàn)實(shí)例一中的(1)(2))2,priviledged :定義在類(lèi)內(nèi)部,能被任何調(diào)用,在調(diào)用上有點(diǎn)類(lèi)似Java中的非靜態(tài)public方法(見(jiàn)實(shí)例一中的(3))3,prototype:這個(gè)概念不太好理解,在執(zhí)行上有點(diǎn)像java的clone,只在類(lèi)初始化的時(shí)候執(zhí)行一次。每次建立實(shí)例的時(shí)候不執(zhí)行。能被繼承。4,static: 有點(diǎn)類(lèi)似java中的靜態(tài)。各實(shí)例共享,不能被繼承實(shí)例一如下:
posted on 2007-05-22 18:07 dreamstone 閱讀(1863) 評(píng)論(3) 編輯 收藏 所屬分類(lèi): 腳本語(yǔ)言javascript
多謝樓主分享 頂了 回復(fù) 更多評(píng)論
不錯(cuò), 收藏了! 回復(fù) 更多評(píng)論
不錯(cuò)了,其實(shí)prototype是最好理解的。 在JavaScript中,如下: function A() { this.t1 = "ffffff"; this.t2 = function (msg) { alert(msg); }; }; A.prototype.p1 = "xxxx"; A.prototype.f1 = function () { do something.... }; 其實(shí)p1,f1是對(duì)function的prototype對(duì)象的操作,大家要明白,function 也是一個(gè)對(duì)象,對(duì)象也有屬性,而prototype就是function的屬性,該屬性 也是一個(gè)對(duì)象,不同之處是,function在做為類(lèi)定義的時(shí)候,創(chuàng)建類(lèi)實(shí)例的 過(guò)程(new的過(guò)程)要參照它的prototype對(duì)象,把prototype對(duì)象的所有 屬性(也就是Java里的成員,包括成員變量和成員函數(shù))都復(fù)制到新的對(duì)象 中去,所以可以看出prototype就是模板,而這個(gè)模板是在new一個(gè)對(duì)象之 前就已經(jīng)存在了。 上面的JavaScript就好像在定義一個(gè)Java類(lèi),不同的是JVM必須把類(lèi)本身 載入虛擬機(jī),然后才允許Java使用者new對(duì)象。而JavaScript,可以先建立 類(lèi)(也就是定義function A的部分),然后再?zèng)Q定類(lèi)中有什么成員(也就是 往A的prototype里追加成員部分)。 而在function A的函數(shù)體內(nèi)定義的this成員,可以理解為‘后’綁定成員。 可以這么理解,在new A()的時(shí)候JavaScript建立了一個(gè)臨時(shí)對(duì)象, 把A.prototype的所有成員復(fù)制到臨時(shí)對(duì)象中,然后再把函數(shù)A中 定義的this成員也綁定到臨時(shí)對(duì)象中,然后把臨時(shí)對(duì)象返回給用戶。 下面是模擬JavaScript的new關(guān)鍵字的處理偽過(guò)程: //建立臨時(shí)對(duì)象 var tobj = {}; //復(fù)制prototype for (var key in A.prototype) tobj[key] = A.prototype[key]; //綁定函數(shù)體內(nèi)的this成員(這個(gè)過(guò)程沒(méi)有辦法模擬) return tobj to user; 之所以存在function內(nèi)部定義的this成員,以及prototype的成員是 有原因的。由于JavaScript的類(lèi)在構(gòu)造時(shí)是可以傳遞構(gòu)造參數(shù)的, 所以,this成員的行為可能由于參數(shù)的不同而不同。這也就是需要后 綁定的原因了。在看下一個(gè)例子: function AA(val1,val2) { this.test1 = function() { alert(val1); }; this.test2 = val2 ? function () { return this.test1;} : function () { return 456; }; this.test3 = val1 ? val1 : function () {alert("no val1");}; } 這個(gè)例子很好的說(shuō)明了后綁定的實(shí)際使用價(jià)值,所以后綁定對(duì)于成員 函數(shù)來(lái)說(shuō)是非常有用的,對(duì)于成員變量來(lái)說(shuō)其實(shí)沒(méi)什么實(shí)際用處。 唯一不同的是,this成員在每次new對(duì)象時(shí)都要被JavaScript引擎解析, 原因很簡(jiǎn)單,根據(jù)不同的構(gòu)造參數(shù),使它們?cè)谶\(yùn)行期的行為可能有很大 的不同。而prototype的成員就不會(huì)每次都解析,第一次定義prototype 成員時(shí)才解析,以后可以直接引用prototype成員,并且更改了prototype 成員,所有已經(jīng)建立的實(shí)例對(duì)象的相應(yīng)成員都會(huì)被更改。 在運(yùn)行期可以通過(guò)'對(duì)象名.成員名'來(lái)更改成員,這種方式可以更改this成員 和prototype成員的默認(rèn)定義,但是更改只限于自身對(duì)象,因?yàn)镴avaScript 和Java一樣,也是傳值,對(duì)象的引用也是一個(gè)地址值,所以new一個(gè)對(duì)象后, prototype的成員也被復(fù)制到那個(gè)對(duì)象上了,再更改那個(gè)對(duì)象的成員,只會(huì) 影響那個(gè)對(duì)象自身,其他從同一個(gè)類(lèi)new出來(lái)的對(duì)象都不會(huì)有任何變化。 不能通過(guò)運(yùn)行期設(shè)置'類(lèi).prototype.成員名'來(lái)覆蓋this同名成員,這樣做沒(méi)有 任何效果。 通過(guò)復(fù)制一個(gè)對(duì)象的所有屬性到一個(gè)新對(duì)象,是不能通過(guò)修改prototype成員 來(lái)修改新對(duì)象的成員行為,因?yàn)樾聦?duì)象不是通過(guò)原來(lái)對(duì)象的類(lèi)new出來(lái)的。 通常的復(fù)制方法如下: var tobj = {}; for (var key in otherObj) tobj[key] = otherObj[key]; 看似tobj和otherObj的行為是一致的,他們不是一個(gè)類(lèi)new出來(lái)的。 最后再談?wù)刾rototype的constructor成員,該成員是對(duì)一個(gè)類(lèi)的構(gòu)造函數(shù)的引用, 在類(lèi)定義的初期,如果一個(gè)類(lèi)沒(méi)有從其他別的類(lèi)那里繼承,該類(lèi)的prototype.constructor屬性保存的是該類(lèi)自身的引用,如果該類(lèi)從別的類(lèi) 繼承,那么它的constructor屬性就保存了父類(lèi)的constructor引用, 一般constructor沒(méi)有什么用處,但可以通過(guò)它來(lái)取得他的類(lèi)的信息, 就像Java里的對(duì)象都有g(shù)etClass()方法,constructor就是干這個(gè)用的。 有它的好處是,再運(yùn)行期可以改變所有同類(lèi)對(duì)象的成員行為,如: someObj.constructor.prototype.somePrototype = function () { other process .... } 因此好的習(xí)慣是在繼承之后把prototype的constructor成員設(shè)置一下, 否則會(huì)把父類(lèi)的prototype成員改掉,那樣程序的行為就不可預(yù)知了。 如: function classA() { } classB.prototype = new classA(); classB.prototype.constructor = classB; 至此所有和prototype有關(guān)的都介紹完畢,歡迎大家指正批評(píng)。 to 作者 : 本來(lái)我想少說(shuō)兩句,但是說(shuō)了那么多,其實(shí)應(yīng)該再開(kāi)一篇 blog,但是我自己不寫(xiě)blog,只能在你這里寫(xiě)兩句了,留著你自己再 整理以下吧。 回復(fù) 更多評(píng)論
Powered by: BlogJava Copyright © dreamstone