<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    DANCE WITH JAVA

    開(kāi)發(fā)出高質(zhì)量的系統(tǒng)

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    好友之家

    最新評(píng)論

    面向?qū)ο螅∣OP)方法使用 JavaScript

    private variables:原始的定義變量的方法 var
    private 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 properties
    2,prototype properties沒(méi)有對(duì)應(yīng)的prototype method
    3,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í)例一如下:

    <script>
            function Pet(name,color)
    {
                
    //priviledged properties
                this.name=name;
                
    this.color=color;
                
    //private properties
                var type="animal";
                
    //private method
                var run2 = function(){
                    run(type);
                }

                var run 
    = function(mType){
                    alert(color
    +" "+name+" is runing("+mType+")");
                }

                
    //priviledged method
                this.callRun = function(){
                    
    /*(1)priviledged method can visit private properties and private method*/
                    run(type);
                }

            }


            Pet.prototype.callPrivateRun 
    =function(pet){
            
    /*(2)can not call run*/            
                
    //pet.run2();
            /*(3)can call priviledge method and priviledge properties*/
                pet.callRun();
            }


            function test()
    {
                var pet 
    = new Pet("pig","black");
                pet.callRun();
                alert(
    "prototype");
                pet.callPrivateRun(pet);

            }

            window.onload
    =test;
        
    </script>
    繼承與覆寫(xiě)
    實(shí)例二演示了繼承、覆寫(xiě)
    另外javascript不支持多態(tài)性
    <script>
            function Pet()
    {
                
    //name
                this.name=null;
                
    this.getName = function() {return this.name;};
                
    this.setName = function(newName) {this.name = newName;};
                
    //abstract method
                this.eat = null;
            }

            
    /*cat inherit from Pet*/
            Cat.prototype 
    = new Pet();
            function Cat()
    {
                
    //implement the abstract method
                this.eat = function(food){
                    alert(
    "The cat (" + this.name+ ") is eating " + food);
                }

            }

            
    /*dog inherit from Pet*/
            function Dog()
    {
                
    //implements the abstract method
                this.eat = function(food){
                    alert(
    "The dog (" + this.name+ ") is eating " + food);
                }

            }

            Dog.prototype 
    = new Pet();
            
    /*Hound inherit from dog*/
            Hound.prototype 
    = new Dog()
            function Hound()
    {
                
    //override
                this.eat = function(food){
                    alert(
    "The Hound (" + this.name+ ") is eating " + food);
                }

            }


            function test()
    {
                var cat 
    = new Cat();
                cat.setName(
    "mimi");
                cat.eat(
    "fish");
                var dog 
    = new Dog();
                dog.setName(
    "wangwang");
                dog.eat(
    "bone");
                var hound 
    = new Hound();
                hound.setName(
    "hali");
                hound.eat(
    "rabbit");            
            }

            window.onload
    =test;
        
    </script>

    posted on 2007-05-22 18:07 dreamstone 閱讀(1863) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): 腳本語(yǔ)言javascript

    評(píng)論

    # re: 面向?qū)ο螅∣OP)方法使用 JavaScript 2007-05-22 23:50 熱門(mén)單曲

    多謝樓主分享 頂了  回復(fù)  更多評(píng)論   

    # re: 面向?qū)ο螅∣OP)方法使用 JavaScript 2007-05-23 10:21 BeanSoft

    不錯(cuò), 收藏了!  回復(fù)  更多評(píng)論   

    # re: 面向?qū)ο螅∣OP)方法使用 JavaScript[未登錄](méi) 2007-05-23 17:15 teddy

    不錯(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)論   

    主站蜘蛛池模板: 亚洲日韩久久综合中文字幕| 亚洲视频一区在线| 久久精品亚洲综合| 亚洲欧洲另类春色校园小说| 亚洲国产成人99精品激情在线| 亚洲精品乱码久久久久久V| 黄色毛片免费在线观看| 最近国语视频在线观看免费播放| 污视频在线观看免费| 97在线观免费视频观看| 免费乱码中文字幕网站| 亚洲精品无码久久一线| 亚洲Av高清一区二区三区| 免费无遮挡无码视频在线观看| 一个人免费视频在线观看www| 精品久久久久成人码免费动漫 | 成全影视免费观看大全二| 四虎影在线永久免费四虎地址8848aa| 亚洲中文字幕无码爆乳AV| 亚洲导航深夜福利| 特级aaaaaaaaa毛片免费视频| 日本免费在线观看| 曰皮全部过程视频免费国产30分钟| 2022中文字字幕久亚洲| 亚洲春色在线观看| 成在线人直播免费视频| 1000部夫妻午夜免费 | 无码乱肉视频免费大全合集| 免费观看国产精品| 亚洲宅男永久在线| 国产亚洲综合一区二区三区| 99久久免费观看| 免费一级毛片在线观看| 亚洲欧洲尹人香蕉综合| 一二三区免费视频| 免费国产黄线在线观看| 国产亚洲高清不卡在线观看| 亚洲国产成人无码AV在线| 久操免费在线观看| 亚洲第一永久AV网站久久精品男人的天堂AV | 一级毛片a免费播放王色电影|