2010-12-07 88 views
1

我正在創建一個對象文字,我將其用作名稱空間。對象文字(名稱空間)碰巧包含一個構造函數MyConstructor。我想在對象文本中擴展MyConstructor的原型。如果我將MyConstructor的聲明拉出並放在myNamespace的聲明之上,一切正常,但MyConstructor不再由myNamespace命名空間。如何最好地完成這項工作?以下編譯失敗,因爲
的'。'在此行中:在對象文字中聲明原型

MyConstructor.prototype = { 

對象字面意義如下。

謝謝, 邁克

var myNamespace = { 
    a: 3, 
    b: function (msg) { 
     alert(this.a); 
    }, 
    MyConstructor: function(xx) { 
     this.x = xx; 
    }, 
    MyConstructor.prototype = { 
     a: 1, 
     b: function() { 
      return true; 
     } 
    } 
}; 

更新:接受的解決方案的工作。但是,我的問題的前提是有缺陷的。在這種情況下,我根本不會使用對象字面值,因爲我發現它很難進行單元測試。相反,我會使用用構造函數創建的普通對象,並將私有對象放入其中。另一件事是,「自我/即時執行功能」雖然在某些方面很漂亮,但對於向新手解釋有點困難。

回答

5

你根本無法在對象字面上做到這一點。抱歉。

至於解決這個問題的方法,使用一個函數來創建您的myNamespace。這樣,它不必是文字,但你仍然可以得到一個命名空間的效果:

var myNamespace = (function(){ 

    var ns = { 
    a: 3, 
    b: function (msg) { 
     alert(this.a); 
    }, 
    MyConstructor: function(xx) { 
     this.x = xx; 
    } 
    }; 

    ns.MyConstructor.prototype = { 
    a: 1, 
    b: function() { 
     return true; 
    } 

    return ns; 
}()); 

那麼這裏發生的是,myNameSpace對象被設置爲立即調用和函數的值返回您正在使用的實際名稱空間對象。沒有其他代碼可以訪問函數中的內容,但由於它在函數內部,因此您可以執行任何操作,而不僅僅是對象文字。解決了你的問題。)

+0

你和你都是正確的,你們都實時回答,但我只能選擇你的答案之一。感謝你們倆。 – Mike 2010-12-08 13:50:18

5

只需使用命名空間

var myNamespace = { 
    myConstructor: function(x) { 
     this.x = x; 
    } 
} 

myNamespace.myConstructor.prototype = { 
    //... 
} 

或者另一個變化

var myNamespace = (function(){ 

    function myConstructor(){} 

    myConstructor.prototype = {}; 

    return { 
     myConstructor: myConstructor 
    } 

})(); 
+0

唉,這當然是最簡單的方法:)我的方式,與功能,仍然可以使用,如果一些複雜的興奮應該隱藏,但這顯然是一個更直接的解決方案。 – Jakob 2010-12-07 22:48:45

0

怎麼樣,創建返回您MyConstructor發電機的功能。如果你創建了一個名爲createMyConstructor的函數,那麼立即調用它,它會返回你想要的。

var myNamespace = { 
    a: 3, 
    b: function (msg) { 
     alert(this.a); 
    }, 
    MyConstructor: (function createMyConstructor() { 
     var cons = function(xx) { 
      this.x = xx; 
     }; 
     cons.prototype = { 
      a: 1, 
      b: function() { 
       return true; 
     }; 
     return cons; 
    })() 
};