|
| 1 | +## The `for in` Loop |
| 2 | + |
| 3 | +Podobnie jak operator `in`, pętla `for in` przeszukuje łańcuch prototypów |
| 4 | +podczas iteracji po właściwościach obiektu. |
| 5 | + |
| 6 | +> **Uwaga:** pętla `for in` **nie** będzie iterować po właściwościach, które |
| 7 | +> mają ustawiony atrybut `enumerable` na `false` na przykład właściwość |
| 8 | +> `length` tablicy. |
| 9 | + |
| 10 | + // Zatrucie Object.prototype |
| 11 | + Object.prototype.bar = 1; |
| 12 | + |
| 13 | + var foo = {moo: 2}; |
| 14 | + for(var i in foo) { |
| 15 | + console.log(i); // wyświetla obie właściwości: bar i moo |
| 16 | + } |
| 17 | + |
| 18 | +Ponieważ nie jest możliwe, aby zmienić zachowanie pętli `for in` to niezbędne |
| 19 | +jest odfiltrowanie niechcianych właściwości wewnątrz ciała pętli, korzystając |
| 20 | +z metody [`hasOwnProperty`](#object.hasownproperty) z `Object.prototype`. |
| 21 | + |
| 22 | +> **Uwaga:** Ponieważ pętla `for in` zawsze przeszukuje cały łańcuch prototypów |
| 23 | +> będzie się ona stawała coraz wolniejsza przy dodaniu każdej kolejnej warstwy |
| 24 | +> dziedziczenia do obiektu. |
| 25 | +
|
| 26 | +### Korzystanie z `hasOwnProperty` do odfiltrowania |
| 27 | + |
| 28 | + // foo z przykładu powyżej |
| 29 | + for(var i in foo) { |
| 30 | + if (foo.hasOwnProperty(i)) { |
| 31 | + console.log(i); |
| 32 | + } |
| 33 | + } |
| 34 | + |
| 35 | +To jest jedyna poprawna wersja, którą należy używać. Ze względu na użycie |
| 36 | +`hasOwnProperty` zostanie wypisane **jedynie** `moo`. Gdy opuścimy `hasOwnProperty` |
| 37 | +kod będzie podatny na błędy, gdy natywne prototypy np. `Object.prototype` |
| 38 | +zostanie rozszerzony. |
| 39 | + |
| 40 | +[Prototype][1] jest jednym z szeroko rozpowszechniony framework, który dokonuje |
| 41 | +takiego rozszerzenia. Używanie tego frameworku oraz nie używanie w pętle `for in` |
| 42 | +metody `hasOwnProperty` gwarantuje błędy w wykonaniu. |
| 43 | + |
| 44 | +### Wnioski |
| 45 | + |
| 46 | +Zaleca się aby zawsze używać metody `hasOwnProperty`. Nigdy nie powinno się dokonywać |
| 47 | +żadnych założeń na temat środowiska, w którym kod będzie wykonywany i czy natywne |
| 48 | +prototypy zostały rozszerzone czy nie. |
| 49 | + |
| 50 | +[1]: http://www.prototypejs.org/ |
0 commit comments