RECAP:Object.prototype è Verboten?
Ok, è stato un po 'da quando ho fatto questa domanda. Come al solito, sono andato a incrementare lo Object.prototype
, nonostante tutti gli argomenti validi contro di esso forniti sia qui che altrove sul web. Credo di essere solo quel tipo di coglione testardo.
Ho cercato di trovare un modo risolutivo per impedire al nuovo metodo di mettere a tacere qualsiasi comportamento previsto, che si è rivelata una cosa molto difficile, ma informativa da fare.
Ho imparato molte cose su JavaScript. Non per ultimo non cercherò nulla di così sfacciato come fare scherzi con i prototipi nativi, (ad eccezione di String.prototype.trim
per IE < 9).
In questo caso particolare, non utilizzo alcuna librerie, quindi i conflitti non erano la mia preoccupazione principale. Ma avendo scavato un po 'più a fondo nei possibili contrattempi giocando con prototipi nativi, non sono propenso a provare questo codice in combinazione con qualsiasi lib.
Osservando questo approccio prototipo, sono giunto a una migliore comprensione del modello stesso. Stavo trattando i prototipi come una qualche forma di classe astratta tradizionale flessibile, facendomi aggrappare al pensiero tradizionale dell'OOP. Questo punto di vista non rende giustizia al modello prototipo. Douglas Crockford ha scritto su questa trappola, purtroppo lo sfondo rosa mi ha impedito di leggere l'articolo completo.
Ho deciso di aggiornare questa domanda nel caso in cui le persone che leggono questo argomento sono tentate di vedere da sole. Tutto ciò che posso dire è: con tutti i mezzi, fallo. Spero che tu abbia imparato un paio di cose belle, come ho fatto io, prima di decidere di abbandonare questa idea piuttosto stupida. Una funzione semplice potrebbe funzionare altrettanto bene, o anche meglio, specialmente in questo caso. Dopo tutto, la sua vera bellezza è che, aggiungendo solo 3 linee di codice, è possibile utilizzare la stessa funzione per aumentare ugualmente prototipi di oggetti specifici.
so che sto per fare una domanda che è stato intorno per un bel po ', ma: Perché Object.prototype è considerato off limits ? È lì, e può essere aumentato allo stesso modo, come qualsiasi altro prototipo. Perché, quindi, non dovresti approfittarne. A mio parere, finché sai cosa stai facendo, non c'è motivo di stare alla larga dal prototipo Object.
Prendete questo metodo, ad esempio:
if (!Object.prototype.getProperties)
{
Object.prototype.getProperties = function(f)
{
"use strict";
var i,ret;
f = f || false;
ret = [];
for (i in this)
{
if (this.hasOwnProperty(i))
{
if (f === false && typeof this[i] === 'function')
{
continue;
}
ret.push(i);
}
}
return ret;
};
}
In sostanza, è la stessa vecchia for...in
ciclo si sia tenere al sicuro in una funzione, o scrivere più e più volte. So che verrà aggiunto a tutti gli oggetti e poiché quasi tutte le catene di ereditarietà in JavaScript possono essere ricondotte allo Object.prototype
, ma nel mio script, lo considero il minore di due mali.
Forse qualcuno potrebbe fare un lavoro migliore a dirmi dove ho sbagliato rispetto a this chap, tra gli altri.
Mentre cercavamo i motivi, NON per toccare il prototipo dello Object
, una cosa continuava a spuntare: rompeva lo for..in
loop-thingy, ma poi di nuovo: anche molte strutture, per non parlare delle vostre catene ereditarie. È quindi una cattiva pratica non includere un controllo .hasOwnProperty
durante il looping delle proprietà di un oggetto, a mio avviso.
Ho trovato anche this piuttosto interessante.Ancora: un commento è abbastanza inequivocabile: estendere i prototipi nativi è una cattiva pratica, ma se i V8 lo fanno, chi sono io per dire che si sbagliano?
Lo so, questo argomento non si accumula abbastanza.
Il punto è: non riesco a vedere un problema con il codice precedente. Mi piace, lo uso molto e finora non mi ha deluso una volta. Sto anche pensando di collegare un paio di funzioni al prototipo Object. A meno che qualcuno non possa dirmi perché non dovrei, è così.
Non ci ho mai pensato. Ma quali strutture infrangono il ciclo 'for ... in'? E per favore spiega come la mia "catena ereditaria" rompe "per ... in"? Non sto cercando di essere testardo, semplicemente non capisco come quegli esempi rompano il ciclo 'for ... in'. Forse un esempio? entrambi gli altri framework e un esempio di interruzione ereditaria personalizzata 'for ... in'. –
chi ha svalutato la mia domanda: per favore, spiega perché –
ama la parte aggiornata: D – c69