最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

阿里巴巴技術文章分享 Javascript繼承機制的實現(xiàn)

 更新時間:2016年01月14日 09:38:45   投稿:lijiao  
這篇文章主要介紹了阿里巴巴技術文章,分享的是一篇關于Javascript實現(xiàn)繼承機制的文章,感興趣的小伙伴們可以參考一下

Javascript作為一門腳本語言,在設計之初并沒有考慮到面向對象的特性。即便到了當今這個遍布現(xiàn)代瀏覽器的年代,各種Javascript 框架/庫如雨后春筍般地瘋狂生長,Javascript中連個 class 關鍵字都沒有。如果你要編寫一個類,你還得借助于function,至于繼承、重載什么的,就別奢望了。

可是,沒有繼承,日子怎么過啊?難道把所有的共有邏輯都拷貝一遍,實現(xiàn)最低級的代碼復用?

答案當然是——NO,所以,我們要自己實現(xiàn)繼承!

目標

最關鍵的目標當然是繼承——子類自動擁有父類的所有公共屬性和方法。

支持instanceof,例如c是子類的實例,而P是父類,c instanceof P應該返回true。

其次應該能夠重寫(Override)父類的方法,并且在子類的方法中,能夠方便地調用到父類的同名方法。

至于說重載(Overload),由于Javascript的語言特性(不可以有同名方法,即便它們參數(shù)列表不一樣),無法實現(xiàn)。

設計與實現(xiàn)

Javascript的對象有一個很重要的屬性——__proto__,也就是原型。原型實質上也是一個對象,所有它也可以有自己的原型,這樣就形成一個原型鏈。當你調用某個對象的某個方法,或者讀取該對象的某個屬性,Javascript執(zhí)行器是這樣做的:

1、首先到該對象中找對應的方法或屬性,如果找不到,
2、到該對象的原型中找,如果還找不到,
3、到原型的原型里面找
4、...
5、直到最后找到Object的原型為止,如果還沒有則返回undefined
如下圖所示:


原型鏈的這個特性,和繼承很相似,所以自然而然,我們可以利用它來實現(xiàn)繼承機制。而原型鏈對instanceof的支持,使得它成為很好的選擇。

我們定義extend函數(shù),這個函數(shù)接受兩個參數(shù),第一個是父類,第二個是子類,如下所示:

function extend(ParentClass, ChildClass) {
  ...
  return ChildClass;
}

這個函數(shù)對子類進行處理,并返回子類。處理的邏輯如下:

建立原型鏈

通過將子類的原型鏈與父類的原型鏈連接起來,子類可以自動擁有父類的方法和屬性:

var pp = ParentClass.prototype,
  cp = ChildClass.prototype;
function T() {};
T.prototype = pp;
ChildClass.prototype = new T();

為了連接原型鏈,需要創(chuàng)建一個父類的實例,并將其賦給子類的原型屬性。但我們不希望在extend方法里面就實例化父類,所以引入了一個中間類T,以解決這個問題。

實現(xiàn)重寫

原型鏈建立之后,原來子類原型上的方法和屬性我們也需要保留下來:

方法

如果父類有同名方法,我們使用一個閉包,來保留對父類方法和子類方法的引用。然后,修改新的原型中該方法的引用,將其指向一個新的 function。在這個function里面,我們創(chuàng)建一個臨時屬性super,將其指向父類方法,并調用子類方法,這樣在子類方法中,通過 this.super可以調用該父類方法:

ChildClass.prototype[name] = (function(pm, cm) {
  return function() {
    var _super = this.super;
    this.super = pm;
    var result = cm.apply(this, arguments);
    this.super = _super;
    return result;
  };
})(pp[name], cp[name]);

屬性

對于屬性,不存在重寫的問題,所以直接將子類原來的原型中的屬性加到新的原型中即可:

ChildClass.prototype[name] = cp[name];

構造器

為了讓子類能夠訪問到父類的構造器,我們將父類賦給子類的super屬性:

ChildClass.super = ParentClass;

如何使用

假設我們要設計一個管理系統(tǒng),里面涉及到客戶、工人和經理等。將客戶和員工的共性抽象出來,我們得到人(People);然后將工人和經理的共性抽象得到員工(Employee)。這樣我們得到三級類結構:


實現(xiàn)這個設計的代碼如下:

function People(firstname, lastname) {
  this.firstname = firstname;
  this.lastname = lastname;
}

function Employee(firstname, lastname, company) {
  Employee.super.apply(this, arguments);
  this.company = company;
}

function Manager(firstname, lastname, company, title) {
  Manager.super.apply(this, arguments);
  this.title = title;
}

我們希望對每個人都有一個描述,People是姓+名;員工在姓+名之后,還包括公司名稱;而經理在員工的描述之后,還包括職位。代碼如下:

People.prototype.summary = function() {
  return this.firstname + " " + this.lastname;
};

Employee.prototype.summary = function() {
  return this.super.call(this) + ", " + this.company;
};

Manager.prototype.summary = function() {
  return this.super.call(this) + ", " + this.title;
};

在所有的成員方法都已經定義好之后,聲明類的繼承(必須先定義方法,再聲明類的繼承,否則無法在方法中使用this.super調用父類方法!):

extend(People, Employee);
extend(Employee, Manager);

使用這些類就比較簡單,直接new就好了:

var people = new People("Alice", "Dickens");
var employee = new Employee("Bob", "Ray", "Alibaba");
var manager = new Manager("Calvin", "Klein", "Alibaba", "Senior Manager");
console.log( people.summary() ); //Alice Dickens
console.log( employee.summary() ); //Bob Ray, Alibaba
console.log( manager.summary() ); //Calvin Klein, Alibaba, Senior Manager

這篇文章不錯吧,那就給個贊吧!

相關文章

  • Javascript結合css實現(xiàn)網頁換膚功能

    Javascript結合css實現(xiàn)網頁換膚功能

    現(xiàn)在網站換皮膚是比較常見的功能,大多數(shù)論壇都有的,要想實現(xiàn)這樣效果可以看如下代碼.
    2009-11-11
  • JavaScript反射與依賴注入實例詳解

    JavaScript反射與依賴注入實例詳解

    這篇文章主要介紹了JavaScript反射與依賴注入,結合實例形式較為詳細的分析了JavaScript反射與依賴注入的概念、原理、定義、使用方法及相關操作注意事項,需要的朋友可以參考下
    2018-05-05
  • 如何實現(xiàn)JavaScript動態(tài)加載CSS和JS文件

    如何實現(xiàn)JavaScript動態(tài)加載CSS和JS文件

    這篇文章主要為大家詳細介紹了JavaScript動態(tài)加載CSS和JS文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-10-10
  • 你不知道的前端console用法分享

    你不知道的前端console用法分享

    console一定是各位前端最熟悉的小伙伴了,有些網站還會在控制臺輸出一些有意思的東西,下面這篇文章主要給大家介紹了關于前端console用法的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-08-08
  • JavaScript實現(xiàn)拖拽和縮放效果

    JavaScript實現(xiàn)拖拽和縮放效果

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)拖拽和縮放效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • uniapp內置組件scroll-view案例詳解(完整代碼)

    uniapp內置組件scroll-view案例詳解(完整代碼)

    這篇文章主要介紹了uniapp內置組件scroll-view案例詳解,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • 深入理解redux之compose的具體應用

    深入理解redux之compose的具體應用

    這篇文章主要介紹了深入理解redux之compose的具體應用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • js中常見的6種繼承方式總結

    js中常見的6種繼承方式總結

    js中的繼承與其說是對象的繼承,但更像是讓函數(shù)的功能和用法的復用,下面這篇文章主要給大家介紹了關于js中常見的6種繼承方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • 一文詳解為什么JavaScript中的JSON.parse()報錯

    一文詳解為什么JavaScript中的JSON.parse()報錯

    這篇文章主要介紹了JavaScript中JSON.parse()方法的使用和常見錯誤,包括非法JSON格式、包含不可解析的字符、使用單引號等,并提供了相應的解決方案和實際項目中的代碼示例,需要的朋友可以參考下
    2025-03-03
  • 檢查輸入的是否是數(shù)字使用keyCode配合onkeypress事件

    檢查輸入的是否是數(shù)字使用keyCode配合onkeypress事件

    檢查輸入的是否是數(shù)字在本文使用keyCode配合onkeypress事件來實現(xiàn),具體示例如下
    2014-01-01

最新評論

泸西县| 东乡族自治县| 泗水县| 包头市| 门源| 车险| 聊城市| 苍南县| 玉树县| 华容县| 馆陶县| 临沭县| 张家口市| 铜梁县| 阿合奇县| 随州市| 肥乡县| 庆安县| 金堂县| 循化| 攀枝花市| 汽车| 嘉荫县| 马尔康县| 读书| 图片| 靖宇县| 壶关县| 开鲁县| 赞皇县| 淮南市| 凤凰县| 留坝县| 武邑县| 沙湾县| 息烽县| 咸丰县| 奉贤区| 辛集市| 镇康县| 香格里拉县|