2012-07-17 93 views
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]]; 
    } 
} 

看来,家长的价值没有被正确设置各一次。林肯定它的东西非常基本,我失踪了,但林不知道它是什么。

在此先感谢。

理查德

+0

我只是试过你的代码(http://jsfiddle.net/TykH3/),它的工作,但我不认为这是一个好主意,修改对象的原型.. – Onkelborg 2012-07-17 21:32:58

+0

[你将无法如果你这样做,在你的页面上使用jQuery](http://docs.jquery.com/Won't_Fix#Object.prototype_Issues)。 – Esailija 2012-07-17 21:39:55

+0

@ByRichardPowell我想你可能误解了,如果有人真的说没关系。你有任何参考? – Esailija 2012-07-17 21:41:10

回答

1

好第一关,为Onkelborg说,这不是一个好主意(我甚至会走这么远,说这是一个非常糟糕的主意)。为核心对象的原型添加属性只是要求麻烦。比方说,你加入这个方法,以及网站上的一些代码(可能是你的,可能是从库)的作用:

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

该循环应该只有通过一次迭代,让“富”作为关键。但在实践中,它会循环两次,因为你的“名称空间”属性将显示为属性。

这样说,如果你真的想这样做,无论如何,你的基本代码应该工作。唯一可能导致parent值错乱的事情是,如果this已关闭,并且要发生这种情况,则必须使用不同的“this”,使用foo.namespace.call(bar)或类似的东西来调用该方法。

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

+0

感谢您的详细解释。为了清楚起见,你是否认为增加所有核心对象的原型是一个糟糕的主意或仅仅是对象原型? (对于令人困惑的术语感到抱歉,希望它仍然可以理解) – 2012-07-17 21:52:55

+0

将它们添加到Object是特别糟糕的,但是同样的基本问题适用于它们中的任何一个。如果你想了解更多,这个链接进入了大量的细节:http://perfectionkills.com/extending-built-in-native-objects-evil-or-not/ – machineghost 2012-07-17 22:01:43

+0

非常感谢这一点。文章和文章链接已被证明是一个有趣的阅读。 – 2012-07-18 08:50:30