2011-12-29 15 views
8

Jestem ciekawy, czy istnieje jakiś sposób, aby zmylić Array.isArray() z obiektu zdefiniowanego przez użytkownika.Czy możesz sfałszować Array.isArray() z obiektu zdefiniowanego przez użytkownika?

z książki Wzory JavaScript:

Array.isArray([]); // true 

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

tego obiektu wyraźnie się nie powiedzie, ale czy jest jakiś inny sposób to zrobić? Jest to zwykła ciekawość, a nie dlatego, że myślę, że można by kiedykolwiek skręcić z .isArray() w zwykłym kodzie klienta (choć byłoby oczywiście fantastycznie wiedzieć, czy mógłbyś!).

Odpowiedz

9

Tylko jeśli ustawisz internal [[Class]] property na "Array", co nie jest możliwe. Z specification:

Funkcja isArray trwa jeden argument arg i zwraca wartość logiczną true jeśli argument jest obiektem, którego właściwość klasa wewnętrzna jest „Array”; w przeciwnym razie zwraca false.

Albo idziesz na odwrót: Utwórz normalną tablicę i jawnie ustaw każdą metodę tablicy na undefined.

+0

Teraz to skłoniło mnie, aby zadać następczych na pytanie: http://stackoverflow.com/questions/8672204/can- ustawiasz-wewnętrzną-klasę-własności-ekskryptu-obiektu –

10

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

A jeśli chcesz być niegrzeczny

Array.isArray.toString = function() { 
    return 'function() { [native code] }'; 
}; 
+0

Oba rozwiązania są dość niegrzeczne. Jest to zmiana globalna, która może spowodować uszkodzenie innych części witryny/aplikacji. –

Powiązane problemy