关于使这一点Javascript代码更好的建议?

时间:2010-09-03 15:27:20

标签: javascript jquery

我正在尝试在特定命名空间(dpcom)下添加函数。这可能是点符号,具体取决于用户在其javascript文件中执行的操作。所以基本上,我希望他们做的是这样的事情:

dpcom.library('something.foo.funcName', function() {
    // Code goes here.
})

他们可以稍后调用他们的东西:

dpcom.something.foo.funcName();

将执行上面定义的代码。我想要帮助改进它的代码就在这里(它使用的是jQuery):

dpcom.library = function(name, func) {
    root = dpcom;
    objects = name.split('.');
    lastElement = objects[objects.length - 1];

    $(objects).each(function(idx, elem) {
        if (elem == lastElement) {
            root[elem] = func;
        } else if (!root[elem]) {
            root[elem] = {}
        }
        root = root[elem];
    });
}

这应该处理可能的点表示法并在我的命名空间内创建对象(如果它们尚不存在)(我不想覆盖任何已经声明的对象)。

我上面的代码看起来效果很好,但我有一种感觉,我可以做得更好,但我的大脑并没有告诉我哪里......有人想要刺它吗?

6 个答案:

答案 0 :(得分:3)

您应该能够使用shift()

以更具吸引力的方式执行此操作
dpcom.library = function(name, func) {
    var root = dpcom,
        objects = name.split('.'),
        elem;

    while (elem = objects.shift()) {
        if (objects.length) {
            if (!root[elem])
                root[elem] = {};
            root = root[elem];
        }
        else
            root[elem] = func;
    }
}

这样,你可以放弃jQuery的要求。另外,不要忘记使用 var 关键字显式声明您的变种。

根据您对性感代码的定义,您也可以替换此块:

        if (objects.length) {
            if (!root[elem])
                root[elem] = {};
            root = root[elem];
        }

使用:

        if (objects.length) 
            root = !root[elem] ? root[elem] = {} : root[elem];

答案 1 :(得分:3)

这是一种奇怪的代码 - 高尔夫吗?

试试这个,它可能有用......

dpcom.library = function(name, func) {
  var p = name.split('.'), e, root = this;
  while (e = p.shift()) root = root[e] = root[e] || (!p.length ? func : {});
}

答案 2 :(得分:1)

这是一个刺痛

dpcom.library = function(name, func) {
    var lastElement, root = dpcom, objects = name.split(/\./);
    lastElement = objects[objects.length - 1];

    $.each(objects, function(idx, elem) {
        if (!root[elem]) {
            if (elem == lastElement) {
                root[elem] = func;
            } else {
                root[elem] = {}
                root = root[elem];
            }
        }
    });
}

修改

我发现自己使用jQuery的extend方法。查看文档here

答案 3 :(得分:1)

对阵列使用reduce方法,

dpcom.library = function(key, value) {
    var objects = key.split('.');
    var leaf = objects.pop();

    var constructHierarchy = function(object, property) {
        return (object[property] = object[property] || {});
    };

    objects.reduce(constructHierarchy, dpcom)[leaf] = value;
};

要增加性感因子,请将第二个值设为通用,而不仅仅是一个函数。它已经在所有答案中完成,但明确它有助于:)

dpcom.library('awesome.object', { foo: 'woah' });

答案 4 :(得分:0)

不知道这是否更性感或更具可读性,但它不需要 da Query 并且没有任何全局变量;)

var dpcom = {'test': null, 'something': {}};
dpcom.library = function(name, func) {
    for(var i = 0, node = this, names = name.split('.'), l = names.length; i < l; i++) {
        node = node[names[i]] = ((i == l - 1) ? func : node[names[i]] || {});
    }
};

dpcom.library('something.foo.funcName', function() {
    // Code goes here.
});

结果:

{ test: null
, library: [Function]
, something: { foo: { funcName: [Function] } }
}

答案 5 :(得分:0)

查看YUI 2的命名空间功能:

YAHOO.namespace('myNS').funcName = function(){/* do something with arguments */};