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

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

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

    jasmine214--love

    只有當你的內心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
    posts - 731, comments - 60, trackbacks - 0, articles - 0

    Javascript --繼承詳解

    Posted on 2010-06-16 21:10 幻海藍夢 閱讀(170) 評論(0)  編輯  收藏 所屬分類: JS

    面向對象與基于對象

    出處:http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.html
    幾乎每個開發人員都有面向對象語言(比如C++、C#、Java)的開發經驗。 在傳統面向對象的語言中,有兩個非常重要的概念 - 類和實例。 類定義了一類事物公共的行為和方法;而實例則是類的一個具體實現。 我們還知道,面向對象編程有三個重要的概念 - 封裝、繼承和多態。

    但是在JavaScript的世界中,所有的這一切特性似乎都不存在。 因為JavaScript本身不是面向對象的語言,而是基于對象的語言。 這里面就有一些有趣的特性,比如JavaScript中所有事物都是對象, 包括字符串、數組、日期、數字,甚至是函數,比如下面這個例子:

    01 // 定義一個函數 - add
    02 function add(a, b) {
    03 ???? add.invokeTimes++;
    04 ???? return a + b;
    05 }
    06 // 因為函數本身也是對象,這里為函數add定義一個屬性,用來記錄此函數被調用的次數
    07 add.invokeTimes = 0;
    08 add(1 + 1);
    09 add(2 + 3);
    10 console.log(add.invokeTimes); // 2

    ?

    模擬JavaScript中類和繼承

    在面向對象的語言中,我們使用類來創建一個自定義對象。然而JavaScript中所有事物都是對象,那么用什么辦法來創建自定義對象呢?

    這就需要引入另外一個概念 - 原型(prototype),我們可以簡單的把prototype看做是一個模版,新創建的自定義對象都是這個模版(prototype)的一個拷貝 (實際上不是拷貝而是鏈接,只不過這種鏈接是不可見,給人們的感覺好像是拷貝)。

    讓我們看一下通過prototype創建自定義對象的一個例子:

    01 // 構造函數
    02 ??? function Person(name, sex) {
    03 ??????? this .name = name;
    04 ??????? this .sex = sex;
    05 ??? }
    06 ??? // 定義Person的原型,原型中的屬性可以被自定義對象引用
    07 ??? Person.prototype = {
    08 ??????? getName: function () {
    09 ??????????? return this .name;
    10 ??????? },
    11 ??????? getSex: function () {
    12 ??????????? return this .sex;
    13 ??????? }
    14 ??? }

    這里我們把函數Person稱為構造函數,也就是創建自定義對象的函數。可以看出,JavaScript通過構造函數和原型的方式模擬實現了類的功能。
    創建自定義對象(實例化類)的代碼:

    1 var zhang = new Person( "ZhangSan" , "man" );
    2 console.log(zhang.getName()); // "ZhangSan"
    3 var chun = new Person( "ChunHua" , "woman" );
    4 console.log(chun.getName()); // "ChunHua"

    當代碼var zhang = new Person("ZhangSan", "man")執行時,其實內部做了如下幾件事情:

    • 創建一個空白對象(new Object())。
    • 拷貝Person.prototype中的屬性(鍵值對)到這個空對象中(我們前面提到,內部實現時不是拷貝而是一個隱藏的鏈接)。
    • 將這個對象通過this關鍵字傳遞到構造函數中并執行構造函數。
    • 將這個對象賦值給變量zhang。

    ?

    為了證明prototype模版并不是被拷貝到實例化的對象中,而是一種鏈接的方式,請看如下代碼:

    01 function Person(name, sex) {
    02 ???? this .name = name;
    03 ???? this .sex = sex;
    04 }
    05 Person.prototype.age = 20;
    06 var zhang = new Person( "ZhangSan" , "man" );
    07 console.log(zhang.age); // 20
    08 // 覆蓋prototype中的age屬性
    09 zhang.age = 19;
    10 console.log(zhang.age); // 19
    11 delete zhang.age;
    12 // 在刪除實例屬性age后,此屬性值又從prototype中獲取
    13 console.log(zhang.age); // 20

    這種在JavaScript內部實現的隱藏的prototype鏈接,是JavaScript賴以生存的溫潤土壤, 也是模擬實現繼承的基礎。

    ?

    如何在JavaScript中實現簡單的繼承?
    下面的例子將創建一個雇員類Employee,它從Person繼承了原型prototype中的所有屬性。

    01 function Employee(name, sex, employeeID) {
    02 ???? this .name = name;
    03 ???? this .sex = sex;
    04 ???? this .employeeID = employeeID;
    05 }
    06 // 將Employee的原型指向Person的一個實例
    07 // 因為Person的實例可以調用Person原型中的方法, 所以Employee的實例也可以調用Person原型中的所有屬性。
    08 Employee.prototype = new Person();
    09 Employee.prototype.getEmployeeID = function () {
    10 ???? return this .employeeID;
    11 };
    12 var zhang = new Employee( "ZhangSan" , "man" , "1234" );
    13 console.log(zhang.getName()); // "ZhangSan

    ?

    上面關于繼承的實現很粗糙,并且存在很多問題:

    • 在創建Employee構造函數和原型(以后簡稱類)時,就對Person進行了實例化,這是不合適的。
    • Employee的構造函數沒法調用父類Person的構造函數,導致在Employee構造函數中對name和sex屬性的重復賦值。
    • Employee中的函數會覆蓋Person中的同名函數,沒有重載的機制(和上一條是一個類型的問題)。
    • 創建JavaScript類的語法過于零散,不如C#/Java中的語法優雅。
    • 實現中有constructor屬性的指向錯誤,這個會在第二篇文章中討論。

    我們會在第三章完善這個例子。

    ?

    JavaScript繼承的實現

    正因為JavaScript本身沒有完整的類和繼承的實現,并且我們也看到通過手工實現的方式存在很多問題, 因此對于這個富有挑戰性的任務網上已經有很多實現了:

    這個系列的文章將會逐一深入分析這些實現,最終達到對JavaScript中如何實現類和繼承有一個深入的了解。

    ?

    下一章我們將會介紹在類實現中的相關知識,比如this、constructor、prototype等。




    本系列文章列表:

    主站蜘蛛池模板: 国产成人免费AV在线播放| 亚洲国产精华液2020| 美女网站在线观看视频免费的| 亚洲综合熟女久久久30p| 亚洲精品永久在线观看| 在线视频观看免费视频18| 亚洲另类自拍丝袜第1页| 精品国产污污免费网站aⅴ| 亚洲色偷偷偷网站色偷一区| 黄桃AV无码免费一区二区三区 | 一个人免费观看www视频在线| 一本无码人妻在中文字幕免费| 国产精品国产午夜免费福利看| 亚洲日韩在线观看免费视频| 亚洲AV综合永久无码精品天堂| a级毛片高清免费视频| 久久精品国产精品亚洲精品| 免费无码作爱视频| 久久亚洲精精品中文字幕| 亚洲美女视频免费| 中国china体内裑精亚洲日本| 免费无码国产V片在线观看| 亚洲Av无码乱码在线znlu| 一区二区三区免费视频播放器| 亚洲精品视频免费看| 亚洲欧洲日韩极速播放| 国产大片91精品免费看3| 国产高清对白在线观看免费91 | 毛片免费在线视频| 亚洲人成网亚洲欧洲无码| 国产精品深夜福利免费观看 | 免费一级毛片在线播放放视频| 久操视频免费观看| 亚洲嫩草影院在线观看| 国产精品无码一区二区三区免费| 久久91亚洲精品中文字幕| 亚洲中文无码亚洲人成影院| 日韩中文字幕免费| jizz免费在线观看| 亚洲毛片免费观看| 亚洲国产精品激情在线观看 |