我不確定你要達到的目標,但這裏有一個例子,其中MyClass
是一個工廠方法爲create
的單例,它允許創建MyClass
實例。
//MyClass will be an object with a create method only
var MyClass = (function() {
function MyClass() {
this.initialized = false;
}
MyClass.prototype = {
init: function() {
this.initialized = true;
return this;
}
};
return {
create: function() {
return new MyClass().init();
}
};
})();
var m = MyClass.create();
console.log(m);
console.log(m.constructor); //Will be Object because we replaced the whole prototype
不過,我不知道爲什麼你想有兩個構造函數(init
和constructor
本身)?你是否試圖將對象創建過程抽象出來,因爲它很複雜?
我懷疑你只是想將constructor
邏輯轉移到另一個函數中,因爲你試圖實現繼承。
你是否簡單地試圖避免在執行以下操作時調用構造函數邏輯?
MyChildClass.prototype = new MyParentClass();
如果是這種情況,使用Object.create
將解決您的問題(它不是在舊的瀏覽器的支持,但有它墊片 - 墊片支持,你需要的功能,但不是一切Object.create
確實是)。
function A(test) {
this.test = test;
}
function B(test) {
A.call(this, test); //call parent constructor
}
B.prototype = Object.create(A.prototype); //inherit from A
var b = new B('test');
console.log(b);
console.log(b instanceof A); //true
你也可以使用一個純粹的原型方法,不使用constructor
功能與new
一起進行。
var A = {
init: function (test) {
this.test = test;
return this;
}
},
B = Object.create(A),
b;
//override constructor function
B.init = function (test) {
return A.init.call(this, test);
};
b = Object.create(B).init('test');
console.log(b);
我認爲你關於繼承的討論不是OP所要求的,它只是噪聲?也許我也不明白這個問題。恕我直言,第一部分完全回答了這個問題,私人構造函數和一個叫它的工廠方法 – 2013-04-27 00:07:57
@JuanMendes,我想提供儘可能多的細節,因爲懷疑OP是因爲不好的原因提出這個問題。 此外,它也回答「也可以使用其他方法來重寫這個可重寫的init()方法」。 – plalx 2013-04-27 02:40:36
你對init函數的原因是正確的,這是因爲我需要避免繼承的構造函數中的初始化邏輯。但是因爲我可以使用Object.create來設置原型鏈,所以我可以將邏輯移回到構造函數中。謝謝! – 2013-04-27 02:56:57