for-in循環(huán)
for-in循環(huán)用來迭代非數組的對象。使用for-in循環(huán)通常也成為枚舉。
從技術上來說,你也可以用for-in來循環(huán)數組,因為數組也是對象,但是不推薦。如果數組有一些自定義的擴展函數,那么就會出錯。另外,對象屬性的順序在for-in循環(huán)中也是不確定的。所以最好還是用普通的循環(huán)來循環(huán)數組用for-in來循環(huán)對象。
在循環(huán)對象的過程中,使用hasOwnProperty()方法來檢驗是對象本身的屬性還是原型鏈上的屬性很重要。
看看下面的這個例子。
// the object var man = { hands: 2, legs: 2, heads: 1 }; // somewhere else in the code // a method was added to all objects if (typeof Object.prototype.clone === "undefined") { Object.prototype.clone = function () {}; }
在這個例子中,我們有一個簡單的稱作man的對象字面量。在其他man定義之前或之后的地方,對象原型有一個很有用的clone()方法。因為原型鏈的原因,所有的對象都自動獲得了這個方法。為了在枚舉man對象的時候出現(xiàn)clone方法,你需要使用hasOwnProperty方法來區(qū)別。如果沒有區(qū)別來自原型鏈的方法,那么就會有一些意想不到的事情發(fā)生:
// 1. // for-in loop for (var i in man) { if (man.hasOwnProperty(i)) { // filter console.log(i, ":", man[i]); } } /* result in the console hands : 2 legs : 2 heads : 1 */ // 2. // antipattern: // for-in loop without checking hasOwnProperty() for (var i in man) { console.log(i, ":", man[i]); } /* result in the console hands : 2 legs : 2 heads : 1 clone: function() */
另外一種使用方法如下:
for (var i in man) { if (Object.prototype.hasOwnProperty.call(man, i)) { // filter console.log(i, ":", man[i]); } }
這樣寫的好處是可以防止man重新定義了hasOwnProperty方法導致的沖突。如果不想寫這么長的一串,你也可以這樣:
var i, hasOwn = Object.prototype.hasOwnProperty; for (i in man) { if (hasOwn.call(man, i)) { // filter console.log(i, ":", man[i]); } }
嚴格意義上講,不適用hasOwnProperty也不是什么錯誤。根據任務的難度和你對代碼的自信程度,你也可以不用這個直接循環(huán)。但是當你不確定的時候,最好還是使用這個方法檢測一下。
另外一種格式上的改變(不會通過jsLint的檢查),去掉for的大括號,然后把if放在同一行。這樣做的好處可以讓循環(huán)體更加突出,縮進也就少一些:
// Warning: doesn't pass JSLint var i, hasOwn = Object.prototype.hasOwnProperty; for (i in man) if (hasOwn.call(man, i)) { // filter console.log(i, ":", man[i]); }
不要擴展內建的原型
擴展原型的構造函數,可以提供一些很強大的功能,但是有時候他太強大了。
有時候你會去擴展Object(),Array(),Fucntion()的原型方法,這樣會導致可維護性的問題,因為這會讓你的代碼的移植性變差。其他的開發(fā)人員使用你的代碼的時候,可能只需要原生的方法,并不需要額外的功能。
另外,你添加進去的方法,如果在循環(huán)的時候沒有使用hasOwnProperty方法就會被遍歷出來,這會讓人很迷惑。
所以,最好還是不要擴展基本的對象。除非是下面的情況:
- 你確定在將來根據ECMAScript規(guī)范,瀏覽器會添加相應的原型方法,那么是可以的,你只不過是提前實現(xiàn)了這個功能。
- 你確定的你要實現(xiàn)的方法不存在–或許有時候在代碼的其他的地方實現(xiàn)了,或者有的瀏覽器支持,這都是不行的。
- 有非常清晰的文檔,并且與團隊成員溝通過
如果在這些情況之下,那么你就可以添加,最好是下面這種形式:
if (typeof Object.prototype.myMethod !== "function") { Object.prototype.myMethod = function () { // implementation... }; }
出處:rockux
責任編輯:bluehearts
上一頁 如何編寫高質量的Javascript代碼 [4] 下一頁 如何編寫高質量的Javascript代碼 [6]
◎進入論壇網頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|