Myślę, że główną korzyścią jest to, aby móc aby kontrolować to, co pojawia się podczas wyliczania właściwości obiektu, takich jak for in
lub Object.keys()
.
MDN wyjaśnia to dobrze Object.defineProperty
: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty
Więc zwykle, gdy ludzie chcą dodać metodę Object
, takich jak PolyFill jakiegoś metody nie obsługiwany w starych przeglądarkach one modyfikować .prototype
. Ale to powoduje, że właściwość jest wyliczalna i zawodzi, co jest zwracane w kolekcji pętli/kluczy (bez użycia .hasOwnProperty
... której nie każdy używa).
Zamiast więc coś takiego:
Object.prototype.myMethod = function() {
alert("Ahh");
};
można użyć Object.defineProperty
wyraźnie powiedzieć, aby nie być przeliczalny:
Object.defineProperty(Object.prototype, 'myMethod', {
value: function() {
alert("Ahh");
},
enumerable: false
});
W ten sposób, na przykład podczas korzystania for (var key in obj)
„myMethod "nie będzie przedmiotem wyliczonym i nie będziesz musiał się martwić o używanie .hasOwnProperty
. Głównym problemem jest to, że niektóre przeglądarki nie obsługują go oczywiście: http://kangax.github.com/es5-compat-table/ i że nie wszystkie biblioteki/kod używają go, więc nie zawsze można polegać na zewnętrznych bibliotekach/kodzie, aby używać go poprawnie i przez cały czas.
Możesz uzyskać dostęp do własności nieprzeliczalnej w dowolnym momencie, po prostu nie pojawi się podczas wyliczania właściwości obiektu - to jest główny punkt.
Sądzę, że wszystkie "predefiniowane" właściwości obiektów są nieprzeliczalne. Rozumiem przez to jedynie własności natywne, niekoniecznie odziedziczone lub stworzone. Tak więc na twoim przykładzie, pop
i push
będzie wyliczone, ale Array.prototype.indexOf
będzie, jeśli zostanie utworzone jako polyfill w starej przeglądarce, która nie obsługuje tej metody ...co oczywiście można uniknąć, używając mojego przykładu powyżej. Innym przykładem jest właściwość length
, która nie jest wyliczana.
Oto przykład ogólnie: http://jsfiddle.net/aHJ3g/
Stosowanie i definicja Object.keys
ważne „Zwraca tablicę własnych właściwości przeliczalnych danego obiektu, w takiej samej kolejności jak te dostarczane przez for-in
pętli (różnica jest to, że pętla for-in
wylicza również właściwości w łańcuchu prototypów). " - od MDN - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys
Myślę, że główną korzyścią jest to, aby 'dla in' pętle bezpieczne - własność nie pojawi się podczas iteracji nad obiektem. Być może zapominam o tym, co enumerability ma ... – Ian
Powiązane: [Jakie są korzyści i niebezpieczeństwa związane z dodaniem metod do Object.prototype w JavaScript?] (Http://stackoverflow.com/questions/3832617/what-are-the - korzyści i zagrożenia związane z dodawaniem metod do prototypu w javas? rq = 1). –