0

我正在尝试将命名空间方法添加到 javascript 中的对象原型。

我希望能够做到的是:

var myObj = {}
myObj.namespace('nested.objects.are.created.if.not.present')

但我迷路了。做一个泛型函数似乎很容易,但不将它添加到原型中。

这是我所拥有的:

Object.prototype.namespace = function(ns_string) {
    var parts = ns_string.split('.');
    var parent = this;
    var i;
    var length = parts.length
    for (i = 0; i < length; i++) {
        // Create a property if it doesnt exist
        if (typeof parent[parts[i]] === "undefined") {
            parent[parts[i]] = {};
        }
        parent = parent[parts[i]];
    }
}

似乎每次都没有正确设置 parent 的值。我确定它是我缺少的一些非常基本的东西,但我不确定它是什么。

提前致谢。

理查德

4

1 回答 1

1

好吧,首先,正如 Onkelborg 所说,这不是一个好主意(我什至会说这是一个非常糟糕的主意)。向核心对象的原型添加属性只是自找麻烦。假设您添加了此方法,并且您网站上的一些代码(可能是您的,可能来自库)执行以下操作:

for (var key in {foo: 'bar'}) {
    // How many times will this iterate?
}

该循环应该只迭代一次,将 'foo' 作为键。但实际上它会循环两次,因为您的“命名空间”属性将显示为属性。

话虽如此,如果你真的想这样做,你的基本代码应该可以工作。唯一可能弄乱的值parent是 ifthis是关闭的,并且要发生这种情况,您必须使用不同的“this”、使用foo.namespace.call(bar)或类似的东西来调用该方法。

如果您不使用call(或它的兄弟,apply)一切都应该工作。

于 2012-07-17T21:42:03.863 回答