2015-10-27 13 views
8

Widziałem ludzi używających dwóch różnych sposobów użycia różnych metod obiektu Array w javascript.Używanie array.prototype.push vs array.push

I przede wszystkim używać go tak:

arr.push(element1, ..., elementN) 

Ale widziałem ludzi używających tego:

Array.prototype.push.apply(this,arguments) 

Rozumiem, że wszystkie obiekty JavaScriptu dziedziczą właściwości i metod z ich prototypu. Prototyp Object.prototype znajduje się na szczycie łańcucha prototypów.

Jakie są różnice między dwoma podejściami i kiedy należy zastosować każde podejście?

+1

Ten ostatni jest dla rzeczy, które nie są tablicą, jak 'argumenty'. –

+0

'element1, ..., elementN' jest błędem składni. 'argumenty' nie jest. – Bergi

+0

Jestem pewien, że była to elipsa zastępcza. –

Odpowiedz

11

Połączenie za pośrednictwem .apply() jest używane, gdy użytkownik chce używać .push() z obiektem, który nie jest tak naprawdę tablicą. Obiekt jQuery na przykład nie jest tak naprawdę instancją tablicy, ale kod przeważnie zachowuje właściwość .length, która wystarcza do tego, aby wyglądała jak macierz, przynajmniej w zakresie .push() i innych metod prototypowych Array.

Dla instancji prawdziwej macierzy, nie ma takiej potrzeby; Metoda .push() jest bezpośrednio dostępna za pośrednictwem łańcucha prototypów.

Więc:

var obj = { length: 0 }; 
Array.prototype.push.apply(obj, ["hello world"]); 
console.log(obj[0]); // hello world 
+0

Dziękuję bardzo za odpowiedź. Czy możesz podać trochę więcej wyjaśnień lub przykład array.prototype.push używany w scenariuszu w czystym javascript. Obecnie jestem z dala od jQuery. Najpierw chcę przejść przez czysty javascript. Rozumiem, co powiedziałeś, ale bardzo prosty przykład/scenariusz byłby niezwykle pomocny. Jeszcze raz bardzo ci dziękuję. – Skywalker

+1

@LorenzovonMatterhorn * podałeś * przykład użycia go w czystym JS. –

+0

@LorenzovonMatterhorn jQuery to tylko JavaScript, i to tylko przykład. Każdy obiekt, który ma właściwość '.length', która jest wartością całkowitą, zrobi. – Pointy

2

Zakładam obejrzałeś Array.prototype.push.apply(this,arguments) w funkcję jak ten

function foo() { 
    arguments.push = function() { 
     Array.prototype.push.apply(this,arguments);  
    } 
    arguments.push(1,2,3); 
    //.... 
} 

tu jest Foo arguments, to jest po prostu Array jak przedmiot, a nie tablicy, nie ma metody wypychania. Więc powinniśmy użyć Array.prototype.push.apply(this,arguments)

+0

Dziękuję za odpowiedź.czy możesz wyjaśnić, co masz na myśli przez "obiekt podobny do tablicy"? – Skywalker

+0

Nie ma znaczenia, że ​​'argumenty' nie mają metody wypychania? Jak myślisz, czy można przepisać ten kod, gdyby miał? – Bergi

+0

@LorenzovonMatterhorn Obiekty przypominające tablicę przypominają tablice. Mają różne ponumerowane elementy i właściwość długości. Ale w tym miejscu podobieństwo się zatrzymuje. Obiekty tablicowe nie mają żadnych funkcji Array, a pętle for-in nawet nie działają! Sprawdź ten artykuł: http://nfriedly.com/techblog/2009/06/advanced-javascript-objects-arrays-and-array-like-objects/ – bpceee

Powiązane problemy