2012-06-19 65 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

你怎么看待周围的工程师建议的工作。 –