Javascript for in的缺陷總結
for in 語句用來列舉物件的屬性(成員),如下
var obj = { name:"jack", getName:function(){return this.name} }; //输出name,getName for(var atr in obj) { alert(atr); }
注意了嗎,沒有輸出obj的toString,valueOf等內建屬性(或稱為內建成員,隱藏屬性和預定義屬性)。即for in用來列舉物件的顯示成員(自訂成員)。
如果重寫了內建屬性呢,下面就重寫obj的toString
var obj = {name:"jack", getName:function(){return this.name}, toString:function(){return "I'm jack."} } for(var atr in obj) { alert(atr); }
會輸出什麼呢?
1、IE6/7/8 下和沒有重寫toString一樣,仍然只輸出name,getName
2、IE9/Firefox/Chrome/Opera/Safari下則輸出name,getName,toString
如果給內建原型新增屬性/方法,那麼for in時也是可遍歷的Object.prototype.clone = function() {} var obj = { name: 'jack', age: 33 } // name, age, clone for (var n in obj) { alert(n) }
if (!Function.prototype.bind) { Function.prototype.bind = function(scope) { var fn = this return function () { fn.apply(scope, arguments) } } } function greet(name) { alert(this.greet + ', ' + name) } for (var n in greet) { alert(n) }