Pozwala uniknąć kolizji - ogólnie rzecz biorąc, problemy z obiektami, które nie mają właściwości o oczekiwanej wartości.
Obiekty w JS są często używane jako mapy klucz-wartość, a klucze mogą być arbitralnymi ciągami znaków - na przykład __defineGetter__
, hasOwnProperty
lub czymś mniej specjalnym. Teraz, gdy chcesz wywołać taką funkcję na nieznanym obiekcie - np. hasOwnProperty
jest często używana w ogólnych funkcjach wyliczeniowych, gdzie można przekazać dowolny JSON - nigdy nie możesz być pewien, czy masz nadpisaną właściwość (która może nawet nie być funkcja) lub oryginalny, który chcesz, lub czy obiekt w ogóle dziedziczy własność. Aby uniknąć tego problemu (lub też this IE bug), musisz użyć Object.prototype.hasOwnProperty.call
- to jest brzydkie.
Przypisywanie nazw wszystkich funkcji na Object
jest użyteczne, jest to czystszy interfejs API, który oddziela metody analizy od interfejsu aplikacji obiektu. Pomaga to również w optymalizacji (upraszczając analizę statyczną) i ułatwia ograniczenie dostępu do interfejsu API do analizy w piaskownicach - przynajmniej taki był design idea.
Możesz być szczęśliwy mając w prototypie defineProperty
, ale możesz go bezpiecznie używać tylko podczas pracy ze znanymi obiektami. Jeśli nadal chcesz go (jak wiesz, kiedy należy używać, a kiedy nie), można użyć
Object.defineProperty(Object.prototype, "defineProperty", {
writable: true,
enumberable: false,
value: function(prop, descr) {
return Object.defineProperty(this, prop, descr);
}
});
ściśle związane: [Dlaczego nie metody obiektu ES5 dodany do Object.prototype?] (Http: // stackoverflow. com/q/9735026/1048572) – Bergi