Array.prototype は使用しない方がいい?
prototypeの有名な問題にobjentオブジェクト汚染、Arrayオブジェクト汚染があると思います。
- 現在ブラウザに実装されているJavaScriptにはforEachがない
- forEachの代替としてfor~inが使われている
- for~in はオブジェクトのプロパティを列挙する
- forEachの代替としてfor~inが使われる事を考慮して、object.prototype は使用すべきではない
Object オブジェクトの prototype に便利メソッドを放り込むのはやめて頂きたい - nazonoDiary
http://d.hatena.ne.jp/nazoking/20050425/1114374966
for...in - MDC
https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Statements/for...in
この理屈はわかります。
一方、Array.prototype はなぜ使用してはいけないのでしょうか?
----
// 数値添字配列
Array.prototype.test=function(){ return 'test'; };
var arr = [1,3,5,7,9];
for(var i=0,l=arr.length; i<l; i++){
console.info(arr[i]); // コンソール出力(要Firebug)
}
// オブジェクト (連想配列ではない)
Array.prototype.test=function(){ return 'test'; };
var arr = { a:1,b:3,c:5,d:7,e:9 };
for(var i in test){
console.info(test[i]); // コンソール出力(要Firebug)
}
----
どちらも問題なく動作します。
問題が発生するとすれば「数値添字配列でfor~inを使用するケース」ですが、それは実装が誤っていると思います。
for~inはオブジェクトのプロパティを列挙する仕組みなので、prototypeで拡張したプロパティまで列挙されるのは自然な動作です。
私はこれを「for~inバグ」と呼ばれることに違和感を覚えるのですが…。
「数値添字配列でfor~inを使用するライブラリがとても多いから、Array.prototype は止めよう」ということなのでしょうか?
JavaScript の Array オブジェクトを汚染させずに拡張してみる - Cyokodog::Diary
http://d.hatena.ne.jp/cyokodog/20081031/ArrayExtend01