2009-09-14 20 views
11

podría alguien por favor dígame, donde en Javascript la diferencia entreDiferencia entre MyClass.prototype = new Object() y MyClass.prototype = Objeto

MyClass.prototype = new Object(); //or ... = {} 

y

MyClass.prototype = Object; 

es? Y si no hay diferencia en el resultado, ¿cuál es la mejor práctica? ¿Cómo se puede ir?

+0

posible duplicado de (http://stackoverflow.com/questions/12592913/what-is-the-reason-to-use-the-new-keyword-here) – Bergi

+1

@Bergi esta pregunta tiene más de 4 años. El que enlazó tiene 2 años ... – moxn

+0

La respuesta de 1,5 años sigue siendo válida, y esta pregunta aún se encuentra a través de la búsqueda y los enlaces. Debería apuntar a otras respuestas útiles ... – Bergi

Respuesta

11

Sus primeros dos ejemplos son completamente equivalentes:

MyClass.prototype = new Object(); // empty object 
MyClass.prototype = {}; // empty object 

Su tercer ejemplo no es válido, ya que está asignando a la MyClass.prototype una referencia a el constructor Object, y es una función, no un objeto nuevo.

yo personalmente prefiero el segundo, el objeto literal o initialiser sintaxis:

MyClass.prototype = {prop1: 'value', prop2: 'value2'}; 
//... 
MyClass.prototype.foo = 'bar'; 
MyClass.prototype.method1: function() {/**/}; 

Editar: En respuesta a tu comentario, un objeto vacío literal { } esencialmente equivalente a new Object() debido a esto:

La producción ObjectLiteral: {} es evaluada de la siguiente manera:

  1. Crea un objeto nuevo como si tuviera la expresión Objeto nuevo().
  2. Resultado de devolución (1).

Para más detalles consultar la sección de 11.1.5 (Object initialiser) del ECMAScript Language Spec (pdf).

Editar: El tercer ejemplo no producirá ningún error, pero no es bueno en absoluto, por ejemplo, puede darle una paliza fácilmente la función constructora de objetos si se amplía después el MyClass.prototype:

MyClass.prototype = Object; 
MyClass.prototype.foo = 'bar'; 

Object.foo === MyClass.prototype.foo; // true 
+0

Hmhm, por lo que si ambos ejemplos no producen errores de ningún tipo y esencialmente hacer lo mismo (como realmente es), es solo la laxitud del motor de JavaScript del navegador que permite que el segundo ejemplo funcione? – moxn

+0

No, sé que {} == new Object(). Lo que quise decir con "segundo ejemplo" fue ... prototype = Object; – moxn

+0

Está bien, ya veo. Gracias por la explicación. – moxn

2

Depende de Object. Si es una función, quiere usar el método new Object(). Si se trata de una "clase virtual" (definida usando Object = {someProperty: someValue}), entonces usa el segundo método.

Algunos más punteros en this page sobre la herencia de prototipo en JavaScript

+1

Gran enlace, gracias – moxn

0

MyClass.prototype.method1: function() {/ ** /};

corrección de lo anterior: debe ser

MyClass.prototype.method1 = function() {/**/}; 

(Tenga en cuenta el signo igual después de 'metodo1').

El colon se utiliza sólo cuando la definición del método es en sí mismo dentro de una definición de objeto, como: [? ¿Cuál es la razón para usar la 'nueva' palabra clave aquí]

var myObject = {myVar1: 10, myMethod1: function() { /* */}; 
Cuestiones relacionadas