JavaScript物件導向-- 繼承(Inherit) - III

如何在JavaScript上做完美繼承?

需要有兩個條件:

1. 用call(當父層Class沒有需要參數傳入時, 因為不確定有多少個參數, 所以不用call來寫)、apply(當父層Class有需要參數傳入時)繼承父層Class的屬性&方法。

2. 指定子層的prototype指向由空的Class產生的新實體(空的Class指向父層Class)(因為有call by sharing問題, 所以不直接指向父層Class), 且設定constructor指向自己本身的Class --> 才能繼承父層Class的原型屬性&方法。


首先舉例使用call繼承父層Class屬性&方法, 且父層Class不需傳入參數:

e.g.

function A() {

this.abc = 12;
this.run = function() {
console.log("go");
};

}

A.prototype.show = function() {

console.log(this.abc);

};

function B() {

A.call(this);

}

var obj = new B();

console.log(obj.abc);                // 12
console.log(obj.run());           // "go"
console.log(obj.show());       // obj.show isn't a function, 因為此例未對原型方法做繼承動作



再者舉例使用apply繼承父層Class屬性&方法, 且父層Class需傳入參數:

e.g.

function A(abc) {

this.abc = abc || 12;

}
A.prototype.show = function() {

console.log(this.abc);

};

function B() {

A.apply(this, arguments);          // 這樣在new時, 便能將參數(內容為array)帶入

}

var obj = new B();

console.log(obj.abc);                             // 12
obj.show();                                             // obj.show is not a function




留言

熱門文章