8

yuiblogの記事for inで、Douglas Crockfordは、ステートメントがオブジェクトのメソッドを反復処理すると述べています。次のコードが["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"]
4

2 に答える 2

12

プロトタイプから継承されたプロパティを含め、すべてのユーザー定義プロパティは列挙可能です。組み込みのネイティブプロパティはそうではありません。toString()それらの1つです。ここを参照してください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"]
于 2010-03-30T01:49:23.090 に答える
3

for..inユーザー定義のプロパティを繰り返します。コードを次のように変更した場合:

Object.prototype.foo = function() { return 'abc'; };

それで

console.log(a);

出力します:

["a", "b", "c", "foo", "d"]

Chetan Sastryが指摘したように、それtoStringはビルトインのネイティブプロパティであるため、扱いが異なります。

于 2010-03-30T01:44:01.497 に答える