2011-08-21 9 views
7

Sto cercando di creare e oggetto che eredita dall'oggetto Date.Come ereditare dall'oggetto Date di Javascript?

Di seguito è riportata una trascrizione di Firebug di ciò che sto cercando di fare.

>>> date_son = Object.create(Date) 
Function {} 
>>> typeof date_son 
"object" 
>>> date_son.gettime 
undefined 
>>> date_son.prototype.getTime 
getTime() 

Uso Object.create per creare un oggetto date_son che eredita dalla data. La funzione/attributo getTime è disponibile su date_son.protype, ma non sull'oggetto date_son stesso.

Sto chiaramente facendo qualcosa di sbagliato. Qualcuno mi può indirizzare nella giusta direzione su come creare un oggetto che eredita da Date in modo che date_son.getTime() sia disponibile sull'oggetto date_son.

Non desidero estendere la Data direttamente, perché penso che fare scherzi/cambiare le impostazioni globali sia una cattiva pratica di programmazione.

+2

Javascript fa distinzione tra maiuscole e minuscole. Stai contrapponendo 'date_son.gettime' con' date_son.prototype.getTime'; notare la differenza di capitalizzazione. –

+2

Sarà ancora 'indefinito' perché' Date' è un oggetto 'Function', non un oggetto' Date'. – user113716

+1

Puoi invece estendere da 'Date.prototype', e questo ti darà i metodi, ma non so che cosa ti farà, perché non funzioneranno su un oggetto Date quando li invocherai. – user113716

risposta

1

Si potrebbe fare questo:

var date_son = Object.create(Date.prototype); 

ma non sembrerebbe fare molto bene perché sarete chiamando quei metodi su qualcosa di diverso da un Date.

console.log(date_son.getTime()); // won't work 

Si potrebbe chiamare così, ma io non so perché ci si vuole:

var date_son = Object.create(Date.prototype); 

var new_date = new Date(); 

console.log(date_son.getTime.call(new_date)); // 1313964470748 

Se si desidera aggiungere una data utilità, e non si desidera estendere Date.prototype, quindi creare una libreria di metodi che accetta un oggetto Date.

var date_son = { 
    some_method: function(d) { 
     // do something with the date 
     return d; 
    } 
}; 

var date = date_son.some_method(new Date); 
+0

Perché rispondi due volte? :( – Raynos

+0

@Raynos: Mi piace davvero vedere il mio avatar! In realtà, la mia risposta originale offriva semplicemente la soluzione "var date_son = Object.create (Date.prototype);" senza considerare se si trattasse di una soluzione utile. accesso ai metodi, ma erano inutili per quello che presumo OP intende. – user113716

2

C'è una nota sul MDN Docs da Mozilla (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date):

Nota: Si noti che gli oggetti data possono essere istanziati solo telefonando data o di utilizzarlo come un costruttore; a differenza di altri tipi di oggetti JavaScript, gli oggetti Date non hanno una sintassi letterale.

Object.create prevede un'istanza quando viene fornito un parametro. Date non è un'istanza autonoma e pertanto non funziona con Object.create.

Inoltre, per affrontare il problema con l'estensione direttamente Data:

Estendere oggetti nativi è qualcosa che viene fatto regolarmente.MooTools lo fa per esempio con la propria .implement metodo:

https://github.com/mootools/mootools-more/blob/master/Source/Types/Date.js#L55

tutorial su nativi che si estendono:

http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-how-to-extend-built-in-objects-in-javascript/

Edit:

E un articolo sui mali presunte estensione nativi: http://perfectionkills.com/extending-built-in-native-objects-evil-or-not/

+1

'Object.create' non si aspetta un oggetto letterale, si aspetta un'istanza di qualsiasi oggetto.Ad esempio,' Object.create ([1, 2, 3]) 'funziona bene, così come' var x = [1, 2, 3]; Object.create (x) 'o' Object.create (new Number (3)) '. – Domenic

+0

Grazie, ho modificato il mio pubblicare di conseguenza. Sono stati mescolati letterali e istanze. – Luwe