我正在尝试在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的值。我确定它缺少一些非常基本的东西,但我不确定它是什么。
提前致谢。
理查德
答案 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
),一切都应该有效。