Object 汚染とは
簡単に言うと Object.prototype を拡張したときに、すべての for in に影響を与えてしまって、いろんなことが困る。という問題である。
DontEnum という内部属性をスクリプトから与える手段がないために発生する。
Object.prototype.hoge = 'ほげ'; for (var p in {}) alert(p); // hoge と表示される
ActionScript では
setPropertyIsEnumerable という関数が Object.prototype に宣言されている。
これを使うことによって、安全にすべてのオブジェクトにメソッドやプロバティを追加することができる。
例えば
以下のソースをコンパイルすると
package { import flash.display.Sprite; import flash.text.TextField; public class Sample extends Sprite { public function Sample() { var textField:TextField = new TextField(); textField.x = 10; textField.y = 10; textField.width = 400; textField.height = 400; addChild(textField); Object.prototype.hoge = 'ほげ'; Object.prototype.fuga = 'ふが'; Object.prototype.piyo = 'ぴよ'; Object.prototype.setPropertyIsEnumerable('hoge', false); var o = {}; for(var p in o) textField.text += o[p]; } } }
「ぴよふが」と表示される。「ほげ」が表示されていないのがわかる
以下のリンクはコンパイル済みの swf
http://sample.ecmascript.jp/Sample.swf