2012-12-03 45 views
3

我試圖在命名空間中創建一個函數,該命名空間將獲得一個新的對象實例。在命名空間內創建一個新的對象javascript

我在嘗試語法錯誤做到以下幾點:

var namespace = { 
    a : function(param){ 
     this.something = param; 
    }, 
    a.prototype.hi = function(){ 
     alert('hi'); 
    }, 

    b : function(){ 
     var t = new a('something'); 
    } 
}; 

什麼是這樣做的正確的語法?是否無法在namespace對象中執行?我不想首先聲明命名空間。謝謝

+0

重複。看到這樣做的答案爲這樣做:http://stackoverflow.com/questions/7137860/javascript-namespace-declaration-with-function-prototype –

+0

謝謝艾利 - 我知道必須有一個簡單的方法來做到這一點,對我來說似乎很常見。不幸的是,我不得不現在做一些代碼重構,但我認爲這不會太糟糕。 – JavaKungFu

回答

7

我不想首先聲明命名空間。

你可以做奇怪的事情是這樣的:

var namespace = { 
    init: function() { 
     a.prototype.whatever = function(){}; 
    }, 
    a: function(x) { 
     this.x = x; 
    } 
} 
namespace.init(); 
var myA = new namespace.a("x"); 

但是,如果你想封裝一切爲什麼不嘗試模塊模式?它的方式清潔:

var namespace = (function() { 
    function a() {}; 
    function b(name) { 
      this.name = name; 
    }; 
    b.prototype.hi = function() { 
      console.log("my name is " + this.name); 
    } 
    return { 
      a: a, 
      b: b 
    } 
})(); 
+0

謝謝,我想我會重構使用模塊模式。 – JavaKungFu

0

javascript命名空間是一個對象,所以你只能使用key: value夫婦,但沒有代碼(如你所做的:a.prototype.hi = function() {...})。

你應該這樣分開,在二:報關,然後代碼:

var namespace = { 
    a : function(param){ 
     this.something = param; 
    }, 
    b : function(){ 
     var t = new a('something'); 
    } 
}; 

namespace.a.prototype.hi : function() { ... } 
+0

我不確定你的評論意味着什麼「沒有代碼」 - 這顯然是不正確的。 – JavaKungFu

+0

是的,可能是它制定得不好,在這裏它是一個JavaScript對象中不可能的「關鍵」a.prototype.hi,但是在值中你可以添加任何你想要的代碼! –

0

我並不確切地知道你想要什麼,但這個工程:

var namespace = { 

    a: function() { 

     function a() { 

     } 

     a.prototype.hi = function() { 
      console.log("hi"); 
     } 

     return new a; 

    } 

} 

var obj = new namespace.a(); 
obj.hi() 

// -> 'hi'