for in ステートメントは、次のようにオブジェクトのプロパティ (メンバー) をリストするために使用されます。
次のようにコードをコピーします。
var obj = { 名前:「ジャック」,
getName:function(){この名前を返す}
};
//出力名,getName
for(obj の var atr) {
アラート(atr);
}
obj の toString や valueOf などの組み込みプロパティ (または組み込みメンバー、非表示プロパティ、事前定義プロパティ) がないことに気づきましたか。つまり、 for in は、オブジェクトの表示されたメンバー (カスタム メンバー) を列挙するために使用されます。
組み込みプロパティをオーバーライドする場合は、obj の toString を以下に書き換えます。
次のようにコードをコピーします。
var obj = {名前:"ジャック",
getName:function(){この名前を返す}、
toString:function(){return "私はジャックです。"}
}
for(obj の var atr) {
アラート(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 = {
名前:「ジャック」、
年齢:33歳
}
// 名前、年齢、クローン
for (obj の var n) {
アラート(n)
}
メソッド clone が Object.prototype に追加され、in の場合はすべてのブラウザで clone が表示されます。
組み込みコンストラクターのプロトタイプを拡張することは一般に推奨されていないため、これは問題ではないかもしれません。これが Prototype.js の衰退の理由の 1 つです。 jQuery と Underscore は自己プロトタイプを拡張しません。前者は jQuery オブジェクトについて大騒ぎしますが、後者は単にアンダースコアの下ですべてのメソッドをハングします。
ただし、ES5 以降のバージョンと互換性を持たせるために、ES5 をサポートしていないブラウザ (IE6/7/8) で組み込みコンストラクターのプロトタイプを拡張する場合があります。この場合、for in は異なります。各ブラウザ。次のように
次のようにコードをコピーします。
if (!Function.prototype.bind) {
Function.prototype.bind = 関数(スコープ) {
var fn = これ
戻り関数 () {
fn.apply(スコープ、引数)
}
}
}
関数挨拶(名前) {
アラート(this.greet + ', ' + 名前)
}
for (greet の var n) {
アラート(n)
}
IE6/7/8 の出力はバインドされますが、他のブラウザーはバインドしません。最新のブラウザではバインドがネイティブにサポートされており、for in は使用できないため、IE6/7/8 では Function.prototype にバインドを追加します。
要約すると、クロスブラウザ設計では、オブジェクトのメンバー名を取得するために for in に依存することはできません。通常、hasOwnProperty を使用して判断します。