我想知道是否有可能通過自動使用超類的構造函數實例化JavaScript中的子類。
考慮這個(由this other question here on SO啓發):繼承和使用超類的構造函數在javascript中
function A(prop) {
this.prop = prop;
}
A.prototype.whatAmI = function() {
console.log(
"I'm an instance of %s, my prop is %s",
this instanceof A1? "A1" : "A2",
this.prop
);
};
function A1() {
A.apply(this, arguments);
}
A1.prototype = new A();
A1.prototype.constructor = A1;
function A2() {
A.apply(this, arguments);
}
A2.prototype = new A();
A2.prototype.constructor = A2;
var a1 = new A1("foo").whatAmI(); //I'm an instance of A1, my prop is foo
var a2 = new A2("bar").whatAmI(); //I'm an instance of A2, my prop is bar
然而,參考this article,在第一個例子中我碰到這行代碼來:
Cat.prototype.constructor = Cat;
//Otherwise instances of Cat would have a constructor of Mammal
我想這正是我需要的: A1
和A2
的實例具有A
的構造函數。不幸的是註釋掉A1.prototype.constructor = A1
和排空A1
的身體(這同樣適用於A2
)不工作:
function A1() {}
A1.prototype = new A();
function A2() {}
A2.prototype = new A();
var a1 = new A1("foo").whatAmI(); //I'm an instance of A1, my prop is undefined
var a2 = new A2("bar").whatAmI(); //I'm an instance of A2, my prop is undefined
最後,改變A
的構造函數使用arguments
對象,而不是明確地傳遞prop
沒有影響之一:
function A() {
this.prop = arguments[0];
}
這是甚至可能的,有點擺弄prototype
屬性,實現我想要的?
你爲什麼要清空機構?只是不要重置構造函數,你應該得到你想要的結果。 – PlantTheIdea 2014-09-04 18:40:03