for循环中的JavaScript是否会迭代方法?

hek*_*ran 8 javascript for-in-loop

一篇关于yuiblog 的文章中,Douglas Crockford说该for in语句将迭代一个对象的方法.为什么以下代码不会产生["a","b","c","d","toString"]?是不是.toString()和my_obj的其他方法成员?

Object.prototype.toString = function(){return 'abc'}
Object.prototype.d = 4;

my_obj = {
    'a':1,
    'b':2,
    'c':3
}

a = []
for (var key in my_obj) {
    a.push(key)
}

console.log(a) // prints ["a", "b", "c", "d"]
Run Code Online (Sandbox Code Playgroud)

Che*_*try 12

所有用户定义的属性都是可枚举的,包括从prototype继承的属性.内置的本机属性不是.toString()是其中之一.请参阅https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/For...in

编辑:我的解释"但是,循环将迭代所有用户定义的属性(包括任何覆盖内置属性)"是直接在对象中覆盖的属性变得可枚举.不是原型本身的覆盖.这意味着:

var my_obj = {a: 1, b: 2, c: 3};
my_obj.toString = function() {return 'abc';};

a = []
for (var key in my_obj) {
    a.push(key)
}

console.log(a) // prints ["a", "b", "c", "toString"]
Run Code Online (Sandbox Code Playgroud)

  • 是的,`Object.prototype.toString.propertyIsEnumerable()== false` (2认同)