将命名空间方法添加到对象原型

时间:2012-07-17 21:27:25

标签: javascript

我正在尝试在javascript中为Object原型添加命名空间方法。

我希望能做到的是:

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的值。我确定它缺少一些非常基本的东西,但我不确定它是什么。

提前致谢。

理查德

1 个答案:

答案 0 :(得分:1)

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

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

该循环仅迭代一次,将'foo'作为键。但实际上它会循环两次,因为你的“namespace”属性会显示为属性。

话虽如此,如果你真的想要这样做,你的基本代码应该可行。唯一可能弄乱parent值的是if this关闭,为了实现这一点,您必须使用foo.namespace.call(bar)使用不同的“this”调用该方法或类似的东西。

如果你没有使用call(或它的兄弟,apply),一切都应该有效。