命名空间实例化的论点



我有一个命名空间生成器,看起来像这样:)。

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,对象defaultextra

,但是如果我运行:

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"

更新,答案

我要做的就是将namespace作为constructor创建,然后将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;
   }

您的代码不会显示您如何将prototypeMethods甚至staticMethods复制到namespace,这使得很难回答问题。我通常使用复制功能进行类似的操作。它适用于静态和原型方法。

这是Mixin/Copy功能:

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您需要像声明namespace时一样添加var,否则将变量全局并可能表现出意外的行为。

最新更新