2015-05-19 75 views
2

的實例我有一個命名空間發電機,看起來像這樣:(作爲一種需求,它也需要有原型對象額外默認)。參數在一個命名空間

function generateNamespace(staticMethods, prototypeMethods){ 

    var namespace = function(){}; //create namespace 
     /**add staticMehods and prototypeMethods to namespace*/ 
    extend(namespace, staticMethods); //extend function from NojeJS 
    extend(namespace.prototype, prototypeMethods); 

    //create extra and default objects. 
    namespace.prototype.default = namespace.prototype.default || {}; 
    namespace.prototype.extra = namespace.prototype.extra || {}; 

    return namespace; 
} 

的想法是產生這樣的命名空間:

var protObj = {id: function(){ 
        console.log("id");     
        } 
       } 
var myNameSpace = generateNamespace({}, protObj); 

當我實例:

var instanceOfmyNameSpace = new myNameSpace(); 

結果中包含的功能id和對象default,和extra

但是,如果我運行:

var instance2 = new myNameSpace({test: "foo"}); 

然後:assert.equal(instance2, instanceOfmyNameSpace) \\=true

這樣就意味着給定的對象只是被忽略(?)。

例如,我需要做些什麼才能將該對象與default合併在一起?完美的輸入/輸出將是:

//input 
var instance2 = new myNameSpace({test: "foo"}); 
//output 
console.log(instance2.default.test) \\-> "foo" 

UPDATE,ANSWER

所有我需要做的是創造namespaceconstructor,然後添加staticMethodsprototypeMethods它:

var extend = require('util')._extend; 
    function generateNamespace(staticMethods, prototypeMethods){ 
     var namespace = function(defaults, extras){ 
      this.default = extend({}, this.constructor.default, defaults); 
      this.extra = extend({}, this.constructor.extra, extras); 
     } 
     extend(namespace, staticMethods); 
     extend(namespace.prototype, prototypeMethods); 

     return namespace; 
    } 
+1

只是說明:你通常不會實例化一個名稱空間。命名空間通常用於封裝可實例化或其他獨立成員(值,函數等)。它看起來像你真正想要的是創建一個類,而不是命名空間。 – doogle

+0

它看起來並不像'prototype'在'namespace.prototype.default = prototype.default ||'行上定義。 {}' – doogle

+0

我已經更新過了。但這不是問題。即使我創建了一個類而不是命名空間,是否可以幫助我將在實例化時賦予的方法'default'與'prototypes'內的'default'對象合併? –

回答

0

你的代碼不會顯示你如何複製prototypeMethods或甚至staticMethodsnamespace這使答案難以解決問題。我通常使用複製功能來執行這些操作。它適用於靜態和原型方法。

這裏是混入/複製功能:

var mixin = function (obj, mixins) { 
    var keys = Object.keys(mixins); 
    for (var i = 0; i < keys.length; i++) { 
     var key = keys[i]; 
     obj[key] = mixins[key]; 
    } 
}; 

而且你會用它想:

function generateNamespace(staticMethods, prototypeMethods){ 
    var namespace = function() {}; //create namespace 

    // copy staticMethods to namespace 
    mixin(namespace, staticMethods); 

    // copy prototype members 
    mixin(namespace.prototype, prototypeMethods); 

    //create extra and default objects. 
    namespace.prototype.default = namespace.prototype.default || {}; 
    namespace.prototype.extra = namespace.prototype.extra || {}; 

    return namespace; 
} 

還要注意的是與線:namespace = function(){}; //create namespace你需要添加一個var像我一樣當聲明namespace時,否則該變量將變爲全局變量,並且可能會出現意外行爲。