2010-08-27 39 views
11

Entiendo la diferencia en comportamiento. Date() devuelve una cadena que representa la fecha actual, y new Date() devuelve una instancia del objeto Fecha cuyos métodos puedo llamar.¿Por qué necesito la palabra clave `new` para una instancia de` Fecha` en JavaScript?

Pero no sé por qué. JavaScript tiene un prototipo, por lo que Date es una función y un objeto que tiene funciones miembro (métodos) que también son objetos. Pero no he escrito ni leído ningún JavaScript que se comporte de esta manera, y me gustaría entender la diferencia.

¿Alguien puede mostrarme un ejemplo de código de una función que tiene un método, devuelve una instancia con el nuevo operador y emite una cadena cuando se llama directamente? es decir, ¿cómo sucede algo como esto?

Date();     // returns "Fri Aug 27 2010 12:45:39 GMT-0700 (PDT)" 
new Date();    // returns Object 
new Date().getFullYear(); // returns 2010 
Date().getFullYear();  // throws exception! 

Solicitud muy específica, lo sé. Espero que sea algo bueno. :)

+3

Re * * por qué: se trata de un desafortunado Hango ver de la implementación original de JavaScript que lo hizo en la especificación de ECMAScript: http://bclary.com/2004/11/07/#a-15.9.2 –

+0

Ooh! Gracias. Amo el contexto y la historia. Eso está bien, ¿por qué? :) –

+0

Gracias @Crescent. Lo he incorporado a mi respuesta para completarlo. –

Respuesta

3

La mayor parte de esto es posible hacerlo usted mismo. Llamar al constructor desnudo sin new y obtener una cadena es especial para Date según las especificaciones de ECMA, pero puede simular algo similar para eso.

Así es como lo harías. En primer lugar declarar un objeto en el patrón constructor (por ejemplo, una función que está destinado a ser llamada con new y que devuelve su referencia this:.

var Thing = function() { 
    // Check whether the scope is global (browser). If not, we're probably (?) being 
    // called with "new". This is fragile, as we could be forcibly invoked with a 
    // scope that's neither via call/apply. "Date" object is special per ECMA script, 
    // and this "dual" behavior is nonstandard now in JS. 
    if (this === window) { 
     return "Thing string"; 
    } 

    // Add an instance method. 
    this.instanceMethod = function() { 
     alert("instance method called"); 
    } 

    return this; 
}; 

Las nuevas instancias de cosas puede tener instanceMethod() les pidió Ahora sólo tiene que añadir un " función estática" en cosa misma:

Thing.staticMethod = function() { 
    alert("static method called"); 
}; 

Ahora usted puede hacer esto:

var t = new Thing(); 
t.instanceMethod(); 
// or... 
new Thing().instanceMethod(); 
// and also this other one.. 
Thing.staticMethod(); 
// or just call it plain for the string: 
Thing(); 
+0

Pero 'Thing()' no hace nada en un contexto estático. ¿La fecha solo detecta si se llama en un contexto estático y devuelve una cadena en lugar de un objeto? ¿Si es así, cómo? –

+0

Su edición lo deja en claro. Gracias. –

+0

Ver la actualización. Esa es una gran pregunta. El comentario de Per @ Crescent sobre la pregunta original, parece que 'Fecha' es especial. Usted puede lograr algo como esto usted mismo como arriba, pero por favor no lo haga.No es un idioma de uso común en JS. –

0

new es una palabra clave en Javascript (y otros) para crear una nueva instancia de un objeto.
Posiblemente duplicado de What is the 'new' keyword in JavaScript?.
Ver también este artículo: http://trephine.org/t/index.php?title=Understanding_the_JavaScript_new_keyword

+0

Solo una conjetura aquí, pero no creo que el problema aquí sea que volverán las cosas nuevas y objetarán. Más bien es el hecho de que se puede llamar a Date() sin crear primero una instancia. (para uso limitado, lo admito) Para obtener la funcionalidad de fecha completa, necesita crear una instancia con nueva. – Tom

+0

Sé lo que 'new' hace (y creo que lo dejé claro en mi pregunta). No sé por qué la función se comporta de manera diferente cuando se llama como un constructor y como una función estática. Quiero saber la sintaxis que causa esta distinción. –

Cuestiones relacionadas