gpt4 book ai didi

javascript - 如何以编程方式将函数添加到嵌套命名空间?

转载 作者:行者123 更新时间:2023-11-30 06:05:59 24 4
gpt4 key购买 nike

假设我有这个函数,当我向它传递一个字符串时,它会为我动态创建我的命名空间,(我很确定基本上 YUI JS 库做了什么):

MyObj.namespace('fn.method.name');

会导致

MyObj.fn.method.name = {}

正在创建 - 所有三个级别都相当于一个空对象。

不过,现在我想做的是将最后一个级别(在本例中为 name)设置为一个函数,但不必重新声明新创建的对象。
所以不要这样做:

function fnName() { /* some code here */ }
MyObj.namespace('fn.method.name');
MyObj.fn.method.name = new fnName();

我想这样调用:

MyObj.add('fn.method.name', fnName);

在内部,add 方法将以编程方式实例化传入的函数:

MyObj.fn.method.name = new fnName()

在我实现它的方式中,我可以创建命名空间对象并将其设置为一个空对象,但是,当我尝试实例化一个传入函数并将该命名空间与传入函数相关联时,它永远不会被添加到命名空间。相反,总是返回一个空对象。有什么想法吗?

编辑:这是命名空间方法。 this 作为 JSON 对象附加到基础对象,因此请忽略格式:

namespace: function (ns) {
var _ns = ns.split('.'),
i = 0, nsLen = _ns.length,
root = this;
if (_ns[0] === gNS) {
_ns.shift();
nsLen = _ns.length;
}
for (i = 0; i < nsLen; i++) {
// create a property if it doesn't exist
var newNs = _ns[i];
if (typeof root[newNs] === "undefined") {
root[newNs] = {};
}
root = root[newNs];
}
return root;
}

edit2 - 删除了传入的 fn 参数

最佳答案

您是否正在寻找这样的东西:

var root = {};

function create(ns, fn) {
var nsArray = ns.split(/\./);
var currentNode = root;

while(nsArray.length > 1) {
var newNS = nsArray.shift();

if(typeof currentNode[newNS] === "undefined") {
currentNode[newNS] = {};
}

currentNode = currentNode[newNS];
}

if(fn) {
currentNode[nsArray.shift()] = fn;
}

else {
currentNode[nsArray.shift()] = {};
}
}

然后:

create("a.b.c");

console.log(root.a);
console.log(root.a.b);
console.log(root.a.b.c);

给予:

Object { b={...}}
Object { c={...}}
Object {}

和:

create("d.e.f", function() { console.log("o hai"); });

console.log(root.d);
console.log(root.d.e);
console.log(root.d.e.f);

给予:

Object { e={...}}
Object {}
function()

调用你定义的函数:

root.d.e.f();

给予:

o hai

关于javascript - 如何以编程方式将函数添加到嵌套命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4658817/

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