gpt4 book ai didi

javascript - 命名空间实例化时的参数

转载 作者:行者123 更新时间:2023-12-04 16:52:13 24 4
gpt4 key购买 nike

我有一个看起来像这样的命名空间生成器:(作为要求,它还需要有额外的和默认的原型(prototype)对象)。

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 ,然后添加 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甚至 staticMethodsnamespace这使得回答问题变得困难。我通常使用复制功能来执行此类操作。它适用于静态和原型(prototype)方法。

这是混合/复制功能:

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 时所做的那样否则该变量将成为全局变量并可能表现出意外行为。

关于javascript - 命名空间实例化时的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30331240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com