7

この質問は、Javascriptで配列を宣言するときに従うべきベストプラクティスは何ですか?に関連しています。


クライアントを「DBクーパー」と呼びましょう。最初の要件として、次のコードを他のJavaScriptコードの前に実行する必要があります。

Array = function(){
    alert('Mwahahahaha');
};

さらに、Cooperでは、カスタム関数を(ハイジャックされたオブジェクトではなく)組み込みオブジェクトに追加する必要がありますArray。たとえば、ハイジャックされていない場合Array、これは次のように実行されます。

Array.prototype.coolCustomFunction = function(){
    alert('I have ' + this.length + ' elements!  Cool!');
};

どちらが余裕があるでしょう:

var myArray = [];
myArray.coolCustomFunction();

ただし、これは最初の要件と互換性がありません。したがって、どのようにしてDBCooperの両方の要件を最もよく満たすことができますか?

注: DBは、ソリューションが彼の要件を満たしていることを確認するためのテストフィドルも作成しました...なんて素晴らしいことでしょう。


更新: チャレンジが好きな人のために:この問題に対するハイジャックできないクロスブラウザソリューションを見つけてみてください。たとえば、 Array、Object、 Array.prototype.constructor、およびObject.prototype.constructorをハイジャックするさらにハイジャックされたテストケース(このBergiを再フォーマットしてくれてありがとう)があります。これまでのところ、これにはブラウザ固有の解決策があるようです(Bergiの回答に関するコメントを参照し、FFでハイジャックする方法を見つけたらお知らせください)が、現時点では不明です。これに対するクロスブラウザソリューション。

4

3 に答える 3

3

Arrayは必ずしもに等しいとは限らないため、これはハードワイヤードであり、変更されないため、元の配列関数を参照するために[].constructor使用できます。[].constructorArray = function(){}

Array = function () { alert("foo")};

// this will always point to the original Array
[].constructor.prototype.foo = "bar";

var myArray = [0, 1];
alert(myArray.foo) // alerts "bar"

http://jsfiddle.net/yXPJ8/5/

于 2012-07-17T16:54:57.507 に答える
3

関数/コンストラクターが何であれ、Array配列のリテラル構文は常に、[[prototype]]がネイティブ配列プロトタイプオブジェクトに設定された「実際の」配列を生成します(これはセキュリティ上の脆弱性でした)。だから、あなたはいつでもそれを使用してそれにアクセスすることができます

Object.getPrototypeOf([])

Arrayまたはがハイジャックされた場合でも[].constructor。(もちろん、ハイジャックされた場合は機能しませんObject。その場合、非常に複雑になります)

DBを停止しました!


回避策を使用する場合、FFでは次の行が常に機能します(ハイジャック可能ではありません)。

[].__proto__.coolCustomFunction = coolCustomFunction;
于 2012-07-17T17:31:08.847 に答える
1

はい...あなたはちょうどしました...しかしあなたは[]..を使用して配列を作成しました。あなたがそれを使用する場合、new Array()それはうまく機能します...

こちらの例をご覧ください

于 2012-07-17T16:44:49.833 に答える