亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Javascript繼承(上)——對象構(gòu)建

系統(tǒng) 2592 0

?

Javascript繼承(下)——干嘛要繼承

?

Quiz1

?

Javascript中存在“類”么?

?

萬物皆對象

Javascript中除了基本數(shù)據(jù)(Undefined、Null、Boolean、Number、String),其他都是對象(Object)。

實(shí)際上,Javascript中的對象是數(shù)據(jù)與功能的集合。例如我們知道:

      
        var
      
       foo = 
      
        new
      
       Function("alert('hello world!')"
      
        );
foo();
      
    

可見foo是一個(gè)函數(shù),也是一種對象。再比如說:

      
        function
      
      
         foo(){
    
      
      
        //
      
      
        do something
      
      
        }

foo.data 
      
      = 123
      
        ;
foo[
      
      "data2"] = "hello"
      
        ;

alert(foo.data);
alert(foo.data2);
      
    

函數(shù)也可以像對象一樣添加屬性。

?

對象的構(gòu)建

一般我們用構(gòu)造函數(shù)來構(gòu)建對象,但如果沒有構(gòu)造函數(shù),我們也有辦法構(gòu)建我們想要的對象:

      
        function
      
      
         creatPerson(__name, __sex, __age){
    
      
      
        return
      
      
         {
        name: __name,
        sex: __sex,
        age: __age,
        get: 
      
      
        function
      
      
        (__key){
            alert(
      
      
        this
      
      
        [__key]);
        }    
    };
}


      
      
        var
      
       Bob = creatPerson("Bob", "male", 18
      
        );
Bob.get(
      
      "name");    
      
        //
      
      
        Bob
      
      
Bob.get("sex");        
      
        //
      
      
        male
      
      
Bob.get("age");        
      
        //
      
      
        18
      
    

但是這不夠,我希望方法是可以共享的。比如我再用該函數(shù)創(chuàng)建一個(gè)Tom對象,get函數(shù)就又被創(chuàng)建了一次,這明顯地浪費(fèi)了我的內(nèi)存。

?

導(dǎo)入共享資源

因?yàn)槲覀冎篮瘮?shù)也是對象,所以我們可以把需要共享的方法或?qū)傩苑旁诜旁谒吧砩稀保?

      
        function
      
      
         creatPerson(__name, __sex, __age){
    
      
      
        var
      
       common =
      
         arguments.callee.common;
    
      
      
        return
      
      
         {
        
      
      
        //
      
      
        自身的屬性
      
      
                name: __name,
        sex: __sex,
        age: __age,
        
      
      
        //
      
      
        自身的方法
      
      
        sayhi: 
      
        function
      
      (){alert("hi"
      
        );},
        
      
      
        //
      
      
        共享的方法
      
      
                get: common.get,
        getType: common.getType,
        
      
      
        //
      
      
        共享的屬性
      
      
                type: common.type
    };
}
creatPerson.common 
      
      =
      
         {
    get:
      
      
        function
      
      
        (__key){
        alert(
      
      
        this
      
      
        [__key]);
    },
    getType: 
      
      
        function
      
      
        (){
        alert(
      
      
        this
      
      
        .type);
    },
    type: 
      
      "Person"
      
        
};


      
      
        var
      
       Bob = creatPerson("Bob", "male", 18
      
        );
Bob.get(
      
      "name");    
      
        //
      
      
        Bob
      
      
Bob.get("sex");        
      
        //
      
      
        male
      
      
Bob.getType();        
      
        //
      
      
        Person
      
    

于是我們就用蹩腳的方法,成功的創(chuàng)建了一個(gè)擁有自有屬性方法和共享屬性方法的對象。但實(shí)際上,Javascript就是這么蹩腳地創(chuàng)建對象的。

其實(shí)共享屬性沒有真正實(shí)現(xiàn),因?yàn)檫@個(gè)共享屬性,依然只是一個(gè)副本。這并不是我們真正希望的共享屬性。

?

new關(guān)鍵字

和上面的“對象的構(gòu)建”相同,new的目的是創(chuàng)建對象的自有屬性和方法。例如:

      
        function
      
      
         Person(__name, __sex, __age){
    
      
      
        this
      
      .name =
      
         __name;
    
      
      
        this
      
      .sex =
      
         __sex;
    
      
      
        this
      
      .age =
      
         __age;
    
      
      
        this
      
      .get = 
      
        function
      
      
        (__key){
        alert(
      
      
        this
      
      
        [__key]);
    };
}


      
      
        var
      
       Bob = 
      
        new
      
       Person("Bob", "male", 18
      
        );
Bob.get(
      
      "name");    
      
        //
      
      
        Bob
      
      
Bob.get("sex");        
      
        //
      
      
        male
      
      
Bob.get("age");        
      
        //
      
      
        18
      
    

?

原型(Prototype)

Javascript的作者用了和上面“導(dǎo)入共享資源”的方法差不多。既然函數(shù)也是對象,那么把需要共享的“東東”放在他“身上”吧:

      
        function
      
      
         Person(__name, __sex, __age){
    
      
      
        this
      
      .name =
      
         __name;
    
      
      
        this
      
      .sex =
      
         __sex;
    
      
      
        this
      
      .age =
      
         __age;
    
      
      
        this
      
      .sayhi = 
      
        function
      
      
        (__key){
        alert(
      
      "hi"
      
        );
    };
}
Person.prototype 
      
      =
      
         {
    constructor: Person,
    get: 
      
      
        function
      
      
        (__key){
        alert(
      
      
        this
      
      
        [__key]);
    }
};


      
      
        var
      
       Bob = 
      
        new
      
       Person("Bob", "male", 18
      
        );
Bob.get(
      
      "name");    
      
        //
      
      
        Bob
      
      
Bob.get("sex");        
      
        //
      
      
        male
      
      
alert(Bob.constructor);    
      
        //
      
      
        function Person
      
    

Javascript創(chuàng)建對象的模型是簡潔的,new來處理自身問題,prototype來處理共享問題。

如果說Java的對象(實(shí)例)產(chǎn)生方式是將原材料丟到模子里(類)熔煉而成;那么Javascript的對象產(chǎn)生方式就是給材料給建筑工(構(gòu)造函數(shù))讓他按圖紙搭建而成。

?

實(shí)際流程

當(dāng)然實(shí)際流程并稍稍有些變化,新建一個(gè)對象先做的是處理共享資源,例如:

      
        function
      
      
         A(){
    console.dir(
      
      
        this
      
      
        );
    alert(
      
      
        this
      
      .type);    
      
        //
      
      
        A
      
      
        }
A.prototype.type 
      
      = "A"
      
        ;


      
      
        var
      
       a = 
      
        new
      
       A();
    

通過console.dir將a打印出來我們可以看到:

type "A"
__proto__ A {type = "A"}
  type "A"
  constructor A()

?

?

?

構(gòu)造函數(shù)新建一個(gè)對象以后,立刻將其prototype的引用賦給新建對象的內(nèi)部屬性__proto__,然后再運(yùn)行構(gòu)造函數(shù)里面的構(gòu)造語句。

?

并沒有覆蓋

      
        function
      
      
         A(){
    
      
      
        this
      
      .type = "B"
      
        
}
A.prototype.type 
      
      = "A"
      
        ;


      
      
        var
      
       a = 
      
        new
      
      
         A();
alert(a.type);    
      
      
        //
      
      
        B
      
    

當(dāng)我們想得到a.type時(shí),引擎會先去在a對象中查看是否有屬性type,如果有則返回該屬性,沒有則試圖在__proto__中查找是否有type屬性,如果有則返回該屬性。

__proto__并不是標(biāo)準(zhǔn)的,比如IE上沒有,但I(xiàn)E上也有類似的內(nèi)部屬性,但我們也無法使用它。

基于這個(gè)原因,我們刪掉a.type時(shí)依然可以返回a.type:

      
        function
      
      
         A(){
    
      
      
        this
      
      .type = "B"
      
        
}
A.prototype.type 
      
      = "A"
      
        ;


      
      
        var
      
       a = 
      
        new
      
      
         A();
alert(a.type);    
      
      
        //
      
      
        B
      
      
        delete
      
      
         a.type;
alert(a.type);    
      
      
        //
      
      
        A
      
    

?

到底有沒有類?

  • 嚴(yán)格地講,Javascript并沒有類(class)這種東西。
  • 但有時(shí)候我們會用構(gòu)造函數(shù)的名字作為利用該構(gòu)造函數(shù)創(chuàng)建的對象們的“類型(type not class)名”,以方便我們用Javascript進(jìn)行面向?qū)ο缶幊虝r(shí)的交流。

名字只是一個(gè)代號,一個(gè)方便理解的工具罷了。

?

?

參考文獻(xiàn)

Javascript繼承機(jī)制的設(shè)計(jì)思想 . 阮一峰?.?2011年6月5日

?

補(bǔ)充閱讀

Javascript的聲明

Javascript引用 ?

Javascript中this關(guān)鍵字詳解

Javascript繼承(上)——對象構(gòu)建


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 激情五月综合综合久久69 | 97午夜理伦片在线影院 | 激情五月婷婷久久 | 国产青草亚洲香蕉精品久久 | 亚洲精品欧美精品日韩精品 | 一区二区三区四区视频在线 | 尤物国产在线精品福利一区 | 亚洲人和日本人jzz护士 | 一级毛片高清免费播放 | 好吊妞操| 天天干天天添 | 97色老99久久九九爱精品 | 狠狠躁夜夜躁人人爽天天天天 | a看片| 欧美ucjizz免费播放器 | 日韩美一区二区 | 日本爱情动作片网址 | 真实偷拍激情啪啪对白 | 99久热成人精品视频 | 精品视频日本 | 性夜黄a爽爽免费视频国产 性夜影院爽黄a爽免费看网站 | 久久永久免费 | 九九国产| 五月婷婷天 | 久久综合桃花网 | 中日韩欧美中文字幕毛片 | 亚洲黄色片视频 | se色综合视频 | 精品久久久久久久久久 | 亚洲91av| 国产蜜汁tv福利在线 | 国产在线91观看免费观看 | 久久精品免费在线观看 | 青青青国产免费线在 | 草草影视在线观看 | 久久婷婷久久一区二区三区 | 擼擼色在线看观看免费 | 999小视频| 久青草国产高清在线视频 | 精品少妇一区二区三区视频 | 亚洲欧美日韩一区二区 |