絕對不要在Object.prototype中加入可列舉的(Enumerable)屬性
如果你的程式碼中依賴for..in迴圈來遍歷Object型別中的屬性的話,不要在Object.prototype中加入任何可列舉的屬性。
但是在對JavaScript執行環境進行增強的時候,往往都需要在Object.prototype物件上新增的屬性或方法。例如可以加入一個方法用來得到某個物件中的所有的屬性名稱:
Object.prototype.allKeys = function() { var result = []; for (var key in this) { result.push(key); } return result; };
但是結果是下面這個樣子的:
({ a: 1, b: 2, c: 3}).allKeys(); // ["allKeys", "a", "b","c"]
一個可行的解決方案是使用函數而不是在Object.prototype上定義新的方法:
function allKeys(obj) { var result = []; for (var key in obj) { result.push(key); } return result; }
但是如果你確實需要向Object.prototype上加入新的屬性,同時也不希望該屬性在for..in迴圈中被遍歷到,那麼可以利用ES5環境提供的Object.defineProject方法:
Object.defineProperty(Object.prototype, "allKeys", { value: function() { var result = []; for (var key in this) { result.push(key); } return result; }, writable: true, enumerable: false, configurable: true });
以上程式碼的關鍵部分就是將enumerable屬性設定為false。這樣的話,在for..in迴圈中就無法遍歷該屬性了。
以上是javascript在哪種情況下不要在Object.prototype中加入可列舉屬性的詳細內容。更多資訊請關注PHP中文網其他相關文章!