È per evitare collisioni: in generale, problemi con oggetti che non hanno la proprietà con il valore che ci si aspetta.
Gli oggetti in JS vengono spesso utilizzati come mappe valore-chiave e le chiavi possono essere stringhe arbitrarie, ad esempio __defineGetter__
, hasOwnProperty
o qualcosa di meno speciale. Ora quando vuoi invocare una funzione di questo tipo su un oggetto sconosciuto - come hasOwnProperty
viene spesso usata nelle funzioni di enumerazione generica, dove può essere passato qualsiasi JSON - non puoi mai essere sicuro se hai una proprietà sovrascritta (che potrebbe anche non essere una funzione) o l'originale che si desidera, o se l'oggetto eredita la proprietà. Per evitare questo problema (o anche this IE bug), dovresti usare Object.prototype.hasOwnProperty.call
- che è brutto.
Quindi, il namespace di tutte quelle funzioni su Object
è utile solo, è un'API più pulita che separa i metodi di riflessione dall'interfaccia dell'applicazione dell'oggetto. Ciò aiuta anche l'ottimizzazione (semplificando l'analisi statica) e semplifica la limitazione dell'accesso all'API di riflessione nelle sandbox, almeno lo design idea.
Si potrebbe essere contenti di avere un defineProperty
nel prototipo, ma è possibile utilizzarlo in modo sicuro solo quando si lavora con oggetti noti. Se si vuole ancora (come si sa quando usare e quando non), è possibile utilizzare
Object.defineProperty(Object.prototype, "defineProperty", {
writable: true,
enumberable: false,
value: function(prop, descr) {
return Object.defineProperty(this, prop, descr);
}
});
strettamente correlati: [Perché sono stati i metodi degli oggetti ES5 non aggiunto al Object.prototype?] (Http: // StackOverflow. it/q/9735026/1048572) – Bergi