2011-12-29 10 views
8

Array.isArray()をユーザー定義のオブジェクトで偽造する方法があるかどうか不思議です。書籍JavaScriptのパターンの中からArray.isArray()をユーザー定義オブジェクトで偽装できますか?

:明らかにオブジェクト

Array.isArray([]); // true 

// trying to fool the check 
// with an array-like object 
Array.isArray({ 
    length: 1, 
    "0": 1, 
    slice: function() {} 
}); // false 

は失敗しますが、それを行うための他の方法はありますか?これは純粋な好奇心であり、通常のクライアントコードで.isArray()とねじ込むことができるとは思っていません(ただし、できるかどうかを知ることは明らかに素晴らしいでしょう)。

答えて

9

internal [[Class]] property"Array"に設定した場合のみ、afaikは使用できません。 specificationから:

isArray関数は、1つの引数argを取り、引数は、そのクラスの内部プロパティは「アレイ」であるオブジェクトである場合、ブール値trueを返します。それ以外の場合はfalseを返します。

通常の配列を作成し、すべての配列メソッドを明示的にundefinedに設定します。

+0

:http://stackoverflow.com/questions/8672204/can-あなたが設定した内部クラスのecmascriptオブジェクトのオブジェクト –

10

Array.isArray = function() { return true; }

そして、あなたはいたずらになりたい場合は

今、あなたは後続の質問をするために私を促してきた
Array.isArray.toString = function() { 
    return 'function() { [native code] }'; 
}; 
+0

両方の解決策はかなりいたずらです。これは、サイト/アプリの他の部分を破壊する可能性のあるグローバルな変更です。 –

関連する問題