2011-08-21 22 views
7

Estoy intentando crear y objetar que hereda del objeto Date.¿Cómo heredar de JavaScript Date Object?

A continuación se muestra una transcripción de Firebug de lo que estoy tratando de hacer.

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

utilizo Object.create para crear un date_son objeto que hereda de la fecha. La función/atributo getTime está disponible en date_son.protype, pero no en el objeto date_son en sí.

claramente estoy haciendo algo mal. ¿Alguien puede señalarme en la dirección correcta sobre cómo crear un objeto que hereda desde Fecha para que date_son.getTime() esté disponible en el objeto date_son.

No deseo extender la fecha directamente, porque creo que desordenar/cambiar los globales es una mala práctica de programación.

+2

Javascript distingue entre mayúsculas y minúsculas. Está contrastando 'date_son.gettime' con' date_son.prototype.getTime'; note la diferencia en mayúsculas. –

+2

Todavía estará 'undefined' porque' Date' es un objeto 'Function', no un objeto' Date'. – user113716

+1

Puede extender desde 'Date.prototype' en su lugar, y eso le dará los métodos, pero no sé qué bien le servirá, porque no estarán operando en un objeto Date cuando los invoque. – user113716

Respuesta

1

Usted puede hacer esto:

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

pero no parecen hacer mucho bien porque se le llama a esos métodos en algo más que un Date.

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

Se le podría llamar así, pero yo no sé por qué te gustaría:

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

var new_date = new Date(); 

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

Si desea añadir algunas utilidades de la fecha, y no desea extender Date.prototype, simplemente cree una biblioteca de métodos que acepten un objeto Date.

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

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

¿Por qué respondes dos veces? :( – Raynos

+0

@Raynos: ¡Realmente me gusta ver mi avatar! En realidad, mi respuesta original simplemente ofrecía la solución 'var date_son = Object.create (Date.prototype);' sin tener en cuenta si era una solución útil. acceso a los métodos, pero fueron inútiles para lo que supongo que OP tiene la intención. – user113716

2

Hay una nota en el MDN Docs por Mozilla (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date):

Nota: Tenga en cuenta que los objetos Date solamente puede representarse por la visita de la fecha o usarlo como un constructor; a diferencia de otros tipos de objetos JavaScript, los objetos Date no tienen sintaxis literal.

Object.create espera una instancia cuando se proporciona un parámetro. Date no es una instancia en sí misma y, por lo tanto, no funcionará con Object.create.

Por otra parte, para abordar el problema con el que se extiende directamente Fecha:

La extensión de los objetos nativos es algo que se hace regularmente.MooTools lo hace por ejemplo con su propia .implement método:

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

Tutorial sobre los nativos que se extienden:

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

Editar:

Y un artículo sobre los presuntos males de extendiendo nativos: http://perfectionkills.com/extending-built-in-native-objects-evil-or-not/

+1

'Object.create' no espera un objeto literal, sino que espera una instancia de cualquier objeto. Por ejemplo,' Object.create ([1, 2, 3]) 'funciona bien, al igual que' var x = [1, 2, 3]; Object.create (x) 'o' Object.create (new Number (3)) '. – Domenic

+0

Gracias, he editado mi publicar en consecuencia. Tenía literal y instancia mezclada. – Luwe