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

Adding a namespace method to the object prototype

本文关键字:命名空间 方法 添加 原型 对象      更新时间:2023-11-09

我正在尝试用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]];
    }
}

似乎每次都没有正确设置父项的值。我确信我错过了一些非常基本的东西,但我不确定它是什么

提前谢谢。

Richard

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

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

该循环应该只迭代一次,将"foo"作为键。然而,在实践中,它会循环两次,因为您的"namespace"属性将显示为一个属性。

话虽如此,如果你真的想这样做,你的基本代码应该可以工作。唯一可能使parent的值混乱的是,如果this处于关闭状态,则必须使用不同的"this"调用方法,使用foo.namespace.call(bar)或类似的方法。

如果您不使用call(或者它的兄弟apply),那么一切都应该正常。