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

首頁 > 編程 > JavaScript > 正文

再論Javascript的類繼承

2019-11-20 23:54:57
字體:
來源:轉載
供稿:網友
無參數類繼承的問題

先看一段示例代碼,實現(xiàn)B繼承于A:
復制代碼 代碼如下:

function A() {
}
A.prototype.a1 = function() {
};

function B() {
}
B.prototype = new A();
B.prototype.b1 = function() {
};

var b = new B();
alert(b.constructor == A); // true
alert(b.constructor == B); // false

這段代碼的主要問題是:

* 需要實例化A作為B的原型,此時就執(zhí)行了A的構造函數。但按照面向對象的規(guī)則,實例化B之前,B及其父類A的構造函數都不應該執(zhí)行。
* 更改了B的prototype,導致b.constructor不是B而是A。

有參類繼承的問題

假設A和B都有兩個字符串參數s1和s2,A中計算了兩段字符串的總長度,B直接以s1、s2為參數調用A:
復制代碼 代碼如下:

function A(s1, s2) {
  this.totalLength = s1.length + s2.length;
}
A.prototype.a1 = function() {  
};

function B(s1, s2) {
}
B.prototype = new A();
B.prototype.b1 = function() {
};

new B("ab", "123");

可以看到,這段代碼中根本沒有辦法把s1和s2傳到A,而又因為實例化A作為B的原型時沒有參數,所以出現(xiàn)了異常:
復制代碼 代碼如下:

s1 is undefined

解決方案

s1和s2的作用域只在B內,要把它們傳到A,就只能在B中操作,借助函數的apply方法就可以實現(xiàn)之:
復制代碼 代碼如下:

function B(s1, s2) {
  A.apply(this, arguments);
  alert(this.totalLength);
}

接下來的問題就是如何把A的方法添加到B的原型中去。這也不難,只要遍歷A.prototype,把方法復制到B.prototype即可。要注意的是,對于同名的方法,自然是子類優(yōu)先(重載),因而不能覆蓋:
復制代碼 代碼如下:

for (var m in A.prototype) {
  if (!B.prototype[m]) { // 父類不能覆蓋子類的方法
    B.prototype[m] = A.prototype[m];
  }
}

后記

考慮到C#、Java等高級語言都拋棄了多繼承,因此,本文所討論的也只是單繼承的情況。而本文所述的繼承方法,也會寫成jRaiser的一個擴展,遲些發(fā)布。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 莲花县| 河北省| 稻城县| 阳山县| 延安市| 永昌县| 隆化县| 平乡县| 怀宁县| 井冈山市| 永年县| 台中市| 昌宁县| 洮南市| 安新县| 延安市| 舒城县| 杨浦区| 吕梁市| 栾川县| 浙江省| 毕节市| 巢湖市| 合水县| 黄龙县| 宁海县| 金寨县| 瑞安市| 桐乡市| 奇台县| 丰台区| 电白县| 六安市| 博野县| 江安县| 昔阳县| 济阳县| 莱州市| 长乐市| 泌阳县| 遂溪县|