2013-04-26 67 views
3

這可能是不可能的,但我很好奇。是否可以使用公共工廠方法定義私有構造函數?Javascript中的私有構造函數與靜態成員

function MyParentClass() {} 
MyParentClass.prototype.init = function() { ... } 

function MyChildClass() {} 
MyChildClass.prototype = new MyParentClass(); 
MyChildClass.prototype.init = function() { 
    ... 
    MyParentClass.prototype.init.apply(this); 
    ... 
} 
MyChildClass.Create = function() { 
    var instance = new MyChildClass(); 
    instance.init(); 
    return instance; 
} 

是否可以隱藏2個構造函數並只顯示Create()?

這種可重寫的init()方法的其他方法也受到歡迎。謝謝。

回答

8

我不確定你要達到的目標,但這裏有一個例子,其中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 

不過,我不知道爲什麼你想有兩個構造函數(initconstructor本身)?你是否試圖將對象創建過程抽象出來,因爲它很複雜?

我懷疑你只是想將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); 
+0

我認爲你關於繼承的討論不是OP所要求的,它只是噪聲?也許我也不明白這個問題。恕我直言,第一部分完全回答了這個問題,私人構造函數和一個叫它的工廠方法 – 2013-04-27 00:07:57

+0

@JuanMendes,我想提供儘可能多的細節,因爲懷疑OP是因爲不好的原因提出這個問題。 此外,它也回答「也可以使用其他方法來重寫這個可重寫的init()方法」。 – plalx 2013-04-27 02:40:36

+0

你對init函數的原因是正確的,這是因爲我需要避免繼承的構造函數中的初始化邏輯。但是因爲我可以使用Object.create來設置原型鏈,所以我可以將邏輯移回到構造函數中。謝謝! – 2013-04-27 02:56:57

相關問題