2012-07-17 69 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