2012-01-25 12 views
7

Occasionalmente c'è un JS framework o una libreria che ritiene sia una buona idea aggiungere alcune nuove funzionalità di rete al prototipo di Object o Array. Non riesco a trovare altri esempi in questo momento, ma ricordo che ho avuto problemi con quello prima. Ovviamente, così facendo si interrompe il buon vecchio ciclo for(...in...), perché improvvisamente anche queste proprietà sono enumerate. Per aggirare il problema è necessario controllare ogni proprietà enumerata con .hasOwnProperty() prima di accedere. Che è ingombrante, quando si cerca di scrivere codice robusto.Puoi creare un oggetto in Javascript che NON eredita da Object?

Quindi mi sono chiesto: c'è un modo in cui potrei creare i miei oggetti così, che non ereditano da Object? L'iniziale giocata con .prototype non ha prodotto risultati. Forse c'è qualche trucco? O tutto erediterà sempre da Object e non c'è nulla che io possa fare al riguardo?

Aggiunto: Suppongo che avrei dovuto notare che lo voglio per gli script client nei browser e che la compatibilità dovrebbe includere IE6 o almeno IE7. Gli altri requisiti della versione del browser sono più clementi, anche se sono i migliori e meglio, naturalmente. (Sì, purtroppo, il mondo delle imprese vive ancora in IE-mondo ...)

+0

* cattivo * vecchio 'per (... in ...)' ciclo sicuramente –

+1

@RobAgar - perché così? Davvero, sono stanco di scrivere cose come 'per (var i, l = myArray.length; i

+0

di solito i framework che cambiano il prototipo, forniscono anche un modo per scorrere gli elementi. In Mootools, 'myObj.each()' farà il lavoro .. anche '[" foo "," bar "]. Each()' – pleasedontbelong

risposta

4

In ECMAScript 5 si può passare a nullObject.create:

> obj = Object.create(null); 
    Object 
    No Properties 
+0

Wow! Eccezionale! Funziona davvero! Tranne la compatibilità del browser è triste. :(Credo che avrei dovuto dirti che ne ho bisogno per IE6, o almeno IE7. –

+0

Penso che in questo caso sei sfortunato e usare '.hasOwnProperty' è la tua unica possibilità .. –

1

È possibile rimuovere in modo esplicito tutte le proprietà degli oggetti che sono enumerabile, ma i browser moderati consentono metodi Object non numerabili.

Dovrebbe funzionare nei browser meno recenti.

function Myobject(props){ 
} 
var O=Object,OP=Object.prototype; 
for(var p in O)delete Myobject[p]; 
for(var p in OP)delete Myobject.prototype[p]; 
+0

Interessante idea, proverò. anche - se non sono enumerabili, allora è già OK. Mi preoccupo solo degli innumerevoli in primo luogo. –

Problemi correlati