一個JavaScript繼承的實現

來源:互聯網
上載者:User

Author:尹偉銘

Blog:http://my.donews.com/yinwm/

如我前面的文章說的,對於JavaScript,一個類,就是一個function,他的類方法(也就是static的)都是作為這個function的一部分,而執行個體方法,都是在prototype上面的。
function ClassA() {
}

ClassA.staticMethod = function () {
}

ClassA.prototype.instanceMethod = function () {
}

在我這個實現當中,一個類的繼承是拷貝父類的所有類方法,這樣子類就有了父類的靜態方法。
然後讓子類的prototype.prototype指向父類的prototype.
然後可以根據自己的需要,重寫一些方法。
function ClassB() {
}
ClassB.staticMethod = ClassA.staticMethod;
ClassB.prototype.prototype = ClassA.prototype;
ClassB.prototype.instanceMethod = function () {
// method 2
}

對於子類,使用一個prototype的鏈,來實現方法的執行個體方法的繼承。之所以選擇這種實現方法,是因為子類是要重寫其中的某些方法的。而prototype又是一個reference,所以直接的寫作ClassB.prototype = ClassA.prototype,會在重寫ClassB的執行個體方法的同時,破壞ClassA的執行個體方法。而修改後的方法則會屏蔽父類的。

尋找方法的順序是,instanceA.prototype.method -> ClassA.prototype.
此時對於類方法的繼承,已經實現,現在需要實現在子類中,調用父類的方法。
對於Java,這樣的使用是很平常的
public void method() {
super.method();
}
在JavsScript中,為了實現此類功能,所以必須保留一個parent的reference,指向ParentClass.prototype.
ClassB.prototype.parent = ClassA.prototype.
那麼在instanceB裡面調用this.parent.method.call(this);就可以使用父類的方法了。使用call調用,是為了把自己的資料傳到父類。更漂亮的解決方案,我還沒有想到。

所以完成的代碼是
function ClassA() {
}

ClassA.prototype.method1 = function () {
}

ClassA.staticMethod = function () {
}

function ClassB(){
}

ClassB.staticMethod = ClassA.staticMethod;

ClassB.prototype.prototype = ClassB.prototype.parent = ClassA.prototype;

這個我抽象出來一個extend方法,

var LCore = function () {
}

LCore.extend = function (destination, source) {
// copy all functons
for (var prop in source) {
if (prop == “prototype”) {
continue;
}

destination.prototype[prop] = source[prop];
}

// make a reference for parent and reference prototype
destination.prototype.prototype = destination.prototype.parent = source.prototype;

return destination;
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.