2010-01-04 50 views
2

我知道使用for..in循環來迭代Array不是迭代的推薦方式。但我很想知道是否有辦法註銷這些擴展。我曾與Groovy一起工作,在Groovy的情況下,有一個註冊表,可以在運行時操作來刪除通過元類指定的其他條目。是否有可能註銷Javascript原型擴展

我當前的用例是Prototype向Array原型添加擴展。由於我使用了大量基於jQuery的插件(我使用jQuery),因此我必須測試網站的大部分功能以確保一切正常。這是相當艱鉅的。至於爲什麼我要使用Prototype和jQuery,那麼就讓我們說,我現在沒有選擇。

我也明白,取消註冊(如果可能的話)這些擴展並不是解決所有代碼協調存在的問題,因爲它意味着對現有實例和新實例的破壞性改變。將會有許多匿名函數依賴於這些擴展,並在以後失敗。我只是很想知道javascript實現和可能的底層邏輯訪問。

感謝 拉姆

回答

2

在for循環的問題是,一些庫(原型)加屬性添加到基礎對象,並導致它們被for循環枚舉。

通過所有的自定義屬性下面的循環將循環添加到基礎 對象,從原型刪除它們,使其安全地使用「爲」使用數組

for (var prop in {}) { 
    delete Object.prototype[prop] 
} 

然而,當你有提到,這將打破原型本身。如果你使用原型,你應該使用他們的一種迭代方法。但是我不明白你想要解決的問題,所以我只是解釋瞭如何撤消原型。

+0

作爲我剛纔提到,我只是想知道這些擴展名是否可以刪除。如果Javascript中存在這樣的事情,我不知道它。非常感謝您的答覆。 – Ram 2010-01-06 11:42:38

0

for ... in是語言的一部分。你不能改變現有的實現,但你總是可以自己寫!

0

如果你有一個「foo.bar()」,你可以做「delete foo.bar;」這將刪除「方法」(屬性)。不知道是否適用於原型繼承的東西,但值得一試。

0

您可以使用Object.hasOwnProperty來確定您通過迭代查看的屬性是屬於數組本身還是其原型。如果它來自原型,你可以在這一點上決定是否將其刪除或忽略它:

for property in myarray { 
    if (myarray.hasOwnProperty(property)) { 
     do_something_useful(); 
    } 
} 

for property in myarray { 
    if (!myarray.hasOwnProperty(property)) { 
     myarray[property] = null; 
     /* or delete myarray.prototype[property] */ 
     /* or recursively search through prototype chain to 
      find the source of property, and delete it there */ 
    } 
} 
+0

我無法理解有人會將此檢查添加到每個迭代循環中。呸。這是我從來沒有認真看過原型的原因之一。 – 2010-01-04 21:05:22

+0

不幸的是,這是JavaScript的必要條件 - 請參閱道格拉斯克羅克福德在這裏:http://yuiblog.com/blog/2006/09/26/for-in-intrigue/ - 這可能是原始問題的原因開始「我明白使用for..in循環迭代Array不是迭代的推薦方式「 – 2010-01-04 22:29:09

+0

只有當你想增加內置類型時,它纔不是必需的,除非你願意,否則我認爲這是一個壞主意渾濁你的循環(我不是)。由於一切都是對象,所以我認爲增加內置類型是非常不明智的。實際上,我發現增強對象總是很糟糕,因爲所有對象現在都有額外的屬性。還發現增大數組並不是有害的,如果你不用數組的循環,這是我們已經採取的方法(因爲這也是ext-js採取的方法,這是我們的主lib) – 2010-01-28 20:49:42