2012-12-03 55 views
4

我正在製作一個小型的類似jQuery的庫,有一件令我奇怪的事情是$.each的行爲。是否有jQuery方法遍歷對象自己的屬性只?

在JavaScript中,我們有一個for...in循環:

for (var key in obj) { 
    console.log(key + ': ' + obj[key]); 
} 

這裏的問題是,它會遍歷繼承性質爲好,也就是說,從性能對象的構造函數的原型來。例如,可以使用hasOwnProperty知道這個。和jQuery 可以做到這一點。

但是,當你傳遞一個對象來$.each,它的行爲完全for...in,遍歷繼承屬性爲好。它也應該稍微慢一點,並且需要輸入更多的字符。

檢查this fiddle看到它在行動和look here的源代碼$.each

所以我的問題是,有沒有一個對象 jQuery中的迭代方法,只包括自己的屬性?如果不是,圖書館的行爲應該是這樣嗎?

編輯:由於jQuery不這樣做,你也可以回答這是否有用。我的意思是,我看不到自己想要迭代原型屬性,但也許我錯過了一些東西。

+0

看看這裏太http://stackoverflow.com/questions/1827458/prototyping-object-in-javascript-breaks-jquery – mplungjan

+1

找到它是通過使用'hasOwnProperty'的唯一途徑。 http://jsfiddle.net/mpTkA/2/ –

+1

在新的瀏覽器中還有'Object.keys()'。 – Pointy

回答

1

jQuery的行爲是有道理的,因爲您可以隨時選擇在循環中添加hasOwnProperty檢查 - 或者不。

我可以看到循環通過繼承屬性可能會在某些情況下(克隆或子類或任何你稱之爲)有用。

+1

「一些場景」部分是我無法弄清楚的部分。你有什麼樣的例子嗎? (並且,如果必須添加'hasOwnProperty'檢查,則可以使用'for ... in'並保存一些輸入)。 –

+0

例如:defaultAjaxSettings = {type:「GET」,...},然後創建一個具有某些特定設置的克隆,但剩下的部分會繼承默認設置? – Christophe

+1

我明白了...但通常會使用'$ .extend'來處理選項圖中的默認值,對吧?或者在一些框架中,通過繼承來做到這一點更爲常見? –