我有一个命名空间生成器,看起来像这样:)。
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"
更新,答案
我要做的就是将namespace
作为constructor
创建,然后将staticMethods
和prototypeMethods
添加到它:
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
,否则将变量全局并可能表现出意外的行为。