2012-06-19 62 views
1

我不知道如何解釋我面臨的問題。我做了一小段片斷。請檢查以下內容:Javascript單例模式

var Package = {}; 

Object.defineProperty(Object.prototype, 'inherit', 
    { 
     value: function(Parent, args) 
     { 
      var temp = function(){}; 
      temp.prototype = Parent.prototype; 
      this.prototype = new temp(); 
      this.uber = Parent.prototype; 
      this.prototype.constructor = this; 
     }, 
     enumerable: false 
    }); 

var Module1 = Package.Module1 = function() { 
    // code; 
}; 
Module1.prototype.method1 = function() { 
}; 


var Module2 = Package.Module2 = function() { 
    // code; 
}; 
Module2.prototype.method2 = function() { 
}; 


var Module3 = Package.Module3 = function() { 
    // code; 
}; 
// using custom : object.prototype.inherit 
// Module3 inherit Module1 and 2; 
Module3.inherit(Module1); 
Module3.inherit(Module2); 
Module3.prototype.method3 = function() { 
}; 

//creating object 
var mod = new Package.Module3(); 
mod.method1(); 
mod.method2(); 
mod.method3(); 

創建國防部對象我可以訪問method1,2和3但實際上我想調用的方法,而無需創建對象,就像Package.Module3.method1();這怎麼可能?

+1

不'Package.Module3'已成爲一個構造函數?您可以將它創建爲一個對象並將其分配給它。或者你將'Module3'的*實例*分配給'Package.Module3'。這完全取決於你想用它做什麼。 –

+0

現在我有。但是可以避免。 –

+0

單例可以是javascript中的對象文字。你沒有很好的使用new的變量實例。更多信息在這裏:http://blog.anselmbradford.com/2009/04/21/object-oriented-javascript-tip-the-quintessential-singleton/ –

回答

1

嘗試是這樣的:

var Module3 = Package.Module3 = (function() {  
    var Module3 = function(){ 
     // using custom : object.prototype.inherit 
     // Module3 inherit Module1 and 2; 
    }; 
    Module3.inherit(Module1); 
    Module3.inherit(Module2); 
    Module3.prototype.method3 = function() { 
    }; 
    return new Module3(); 
})(); 

在這種情況下,你有Module3類只有一個實例。

用法

Package.Module3.method1(); 
Package.Module3.method2(); 
Package.Module3.method3(); 
+0

我希望這項工作將適合我讓我檢查它 –

+0

這是否有任何性能缺點 –

+1

@JaisonJustus沒有......... – Engineer

5

對象文字符號?

var Package = { 
    ModuleA : { 
     methodA : function(){}, 
     methodB : function(){} 
    }, 
    ModuleB : { 
     methodC : function(){}, 
     methodD : function(){} 
    } 
} 

Package.ModuleA.methodA(); 
+0

但我的繼承方法不會工作。 (C,P)var F = function(){}; F.原型= P.prototype; C.prototype = new F(); C.uber = P.prototype; C.prototype.constructor = C; } –

+0

@JaisonJustus然後創建一個外部繼承函數:'方法:ns.inheritFrom(SomeClass的,someclass2 ...)' – Joseph

+0

你怎麼看待周圍的工程師建議的工作。 –