国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

基于JavaScript實現繼承機制之構造函數方法對象冒充的使用詳解

2024-05-06 15:48:07
字體:
來源:轉載
供稿:網友
我們知道JavaScript是面向對象的腳本語言,那么既然是面向對象,繼承一定是必不可少的了。JavaScript的核心是ECMAScript,JavaScript繼承機制的實現其實就是ECMAScript繼承機制的實現

繼承的方式

ECMAScript 實現繼承的方式不止一種。這是因為 JavaScript 中的繼承機制并不是明確規定的,而是通過模仿實現的。這意味著所有的繼承細節并非完全由解釋程序處理。作為開發者,你有權決定最適用的繼承方式。最原始的繼承實現方式就是對象冒充,下面著重介紹該方法。

對象冒充

對象冒充實現繼承的核心其實依賴于在函數環境中使用 this 關鍵字。其原理如下:構造函數使用 this 關鍵字給所有屬性和方法賦值(即采用類聲明的構造函數方式)。因為構造函數只是一個函數,所以可使 ClassA 構造函數成為 ClassB 的方法,然后調用它。ClassB 就會收到 ClassA 的構造函數中定義的屬性和方法。例如,用下面的方式定義 ClassA 和 ClassB:

復制代碼 代碼如下:


function ClassA(sColor) {
this.color = sColor;
this.sayColor = function () {
alert(this.color);
};
}

function ClassB(sColor) {
}


關鍵字 this 引用的是構造函數當前創建的對象。不過在這個方法中,this 指向的所屬的對象。這個原理是把 ClassA 作為常規函數來建立繼承機制,而不是作為構造函數。如下使用構造函數 ClassB 可以實現繼承機制:

復制代碼 代碼如下:


function ClassB(sColor) {
this.newMethod = ClassA;
this.newMethod(sColor);
delete this.newMethod;
}


在這段代碼中,為 ClassA 賦予了方法 newMethod(請記住,函數名只是指向它的指針)。然后調用該方法,傳遞給它的是 ClassB 構造函數的參數 sColor。最后一行代碼刪除了對 ClassA 的引用,這樣以后就不能再調用它。

所有新屬性和新方法都必須在刪除了新方法的代碼行后定義。否則,可能會覆蓋超類的相關屬性和方法:

復制代碼 代碼如下:


function ClassB(sColor, sName) {
this.newMethod = ClassA;
this.newMethod(sColor);
delete this.newMethod;

this.name = sName;
this.sayName = function () {
alert(this.name);
};
}


為證明前面的代碼有效,可以運行下面的例子:

復制代碼 代碼如下:


var objA = new ClassA("blue");
var objB = new ClassB("red", "John");
objA.sayColor(); //輸出 "blue"
objB.sayColor(); //輸出 "red"
objB.sayName();//輸出 "John"


對象冒充可以實現多重繼承

有趣的是,對象冒充可以支持多重繼承。例如,如果存在兩個類 ClassX 和 ClassY,ClassZ 想繼承這兩個類,可以使用下面的代碼:

復制代碼 代碼如下:


function ClassZ() {
this.newMethod = ClassX;
this.newMethod();
delete this.newMethod;

this.newMethod = ClassY;
this.newMethod();
delete this.newMethod;
}


這里存在一個弊端,如果存在兩個類 ClassX 和 ClassY 具有同名的屬性或方法,ClassY 具有高優先級。因為它從后面的類繼承。除這點小問題之外,用對象冒充實現多重繼承機制輕而易舉。

由于這種繼承方法的流行,ECMAScript 的第三版為 Function 對象加入了兩個方法,即 call() 和 apply()。后來很多衍生出來的實現繼承的方法其實也是基于call() 和 apply()來實現的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 泰顺县| 鲜城| 达拉特旗| 天祝| 宁武县| 卢氏县| 鄂伦春自治旗| 布尔津县| 五常市| 磐安县| 精河县| 恭城| 南安市| 顺昌县| 安乡县| 河西区| 正镶白旗| 乌苏市| 阳东县| 灵石县| 大邑县| 肇东市| 永州市| 馆陶县| 普陀区| 玉山县| 中宁县| 望都县| 固阳县| 宽城| 南平市| 五原县| 阿瓦提县| 浦东新区| 威远县| 吉林市| 仁怀市| 盐池县| 庄浪县| 壶关县| 鹤壁市|