クロージャーからオブジェクト参照を取得する

var singleton = (function () { var data, method_args; data = []; method_args = []; function add (items) { var i; data.push(items); method_args.push(arguments); } function remove () { data.pop(); method_args.push(arguments); } return { add : add, remove : remove } }());
      
      





シングルトンオブジェクトへのアクセスがあります。



シングルトンのパブリックメソッド(例として示します。値は初期化時に作成されるクロージャーです)取得したい配列のメソッドを呼び出します。 これらのメソッドでは、 これは切望された配列を指します。 だからあなたはこれを介してそれに到達することができます。



method_args.pushがなかった場合は、 Array.prototype.pushを再定義することで取得できます(オブジェクトの「窃盗」の後、その場所にすべてを強制的に戻す)。



 var original_push, data; //    original_push = Array.prototype.push; //    Array.prototype.push = function () { //   data = this; }; //    singleton.add(); //      Array.prototype.push = original_push; //     console.log(data);
      
      





ただし、 プッシュは複数回使用されます。 メソッドの1回限りの失敗は、故障につながる可能性があります。 しかし、私はそのようには感じません。 配列へのリンクをお願いします。 作業の標準ロジックを維持しながら、上記のコードを書き換えることを意味します。 最初の呼び出しでのみこのリンクを取得し、デフォルトの動作を模倣できるほどスマートな新しいプッシュメソッドを作成します。



 var original_push, fake_method_calls, data; //    original_push = Array.prototype.push; //  fake_method_calls = 0; //    Array.prototype.push = function () { //  this     if (fake_method_calls === 0) { data = this; } fake_method_calls += 1; //   return original_push.apply(this, arguments); } //    singleton.add(); //      Array.prototype.push = original_push; //     console.log(data);
      
      





出来上がり:羊は無傷で(標準的なロジックは壊れていません)、オオカミはいっぱいです(手にリンク)。



All Articles