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
需要有兩個條件:
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
留言
張貼留言