2009-11-16 10 views
15

que vienen del fondo tradicional desarrollador web donde puedo de ninguna manera pretender saber realmente nada de Javascript, sin embargo estoy tratando.¿El nuevo operador de Javascript hace algo más que dificultar la vida?

Actualmente tengo lo que describiría como una comprensión bastante novata de JQuery, una comprensión un poco mejor de los cierres, y la he leído, y me siento como que soy bastante claro en "Javascript: The Good Parts" de Douglas Crockford. .

He estado compilando algunas páginas bastante intensivas en JavaScript últimamente y estoy bastante satisfecho con los resultados. Una cosa que llama la atención es que me las arreglé para hacer todo con casi ninguna función global y sin usar el nuevo operador ni siquiera una vez.

De hecho, a partir de mi lectura del libro mencionado anteriormente, el operador no hace nada que no pueda hacer de otra manera más simple y le obliga a hackear la variable 'this'.

Entonces, ¿hay algo que me falta? ¿El nuevo operador realmente sirve para un propósito o es solo un truco para hacer que los programadores de OO se sientan cómodos en un lenguaje funcional? ¿Sería mejor que me llamara por completo de mi vocabulario de JS?

+0

no ser excesivamente crítico, pero tenga en cuenta Functional programming vs procedural programming Lo sentimos, sintiendo exigente de hoy ... – Kendrick

+0

No estoy seguro de que consiga lo que quiere decir Kendrick, ¿estás diciendo que debería haber relacionado el término "funcional "¿?" Al parecer –

+0

comentarios no se analizan de la misma manera ... programación funcional: http://en.wikipedia.org/wiki/Functional_programming programación de procedimiento: http://en.wikipedia.org/wiki/Procedural_programming Sabía lo que significaba, sin embargo, y es para permitirle hacer OO escribir cosas con el idioma, lo que hace que muchas personas se sientan más cómodas y facilita el uso para muchas tareas. – Kendrick

Respuesta

8

En primer lugar, felicitaciones en la lectura de Javascript: las partes buenas, es un gran libro sobre el lenguaje.

Para responder a su pregunta, se requiere el operador new si desea hacer uso de la herencia prototípica. No hay otra manera de tener un objeto "heredar" de otro. Dicho esto, puede copiar propiedades de un objeto a otro que eliminarían la necesidad del operador en algunos casos.

Por ejemplo, un enfoque clásico usaría el siguiente:

function MyClass() {}; 
MyClass.prototype.sayHello = function() { 
    alert('hello'); 
}; 


var o = new MyClass(); 
o.sayHello(); 

se puede lograr relativamente lo mismo de la siguiente manera:

function MyClass() { 
    return { 
     sayHello: function() { 
     alert('hello'); 
     } 
    }; 
} 

var o = MyClass(); 
o.sayHello(); 
+0

En realidad, puedes evite usar nuevo configurando la propiedad del prototipo directamente en un objeto. Esto tiene el desafortunado efecto secundario de hacer que o.hasOwnProperty ("prototipo") devuelva verdadero, donde devolvería falso si se usó nuevo. –

+0

Gracias Bryan. ¿No podría hacer que su función devuelva la función de la que desea "heredar" y agregar la nueva funcionalidad que desee directamente? ¿No es esa la forma más natural de lograr lo mismo? –

+2

Frank: En realidad, asignar la propiedad del prototipo a un objeto no hace que el objeto herede de ese prototipo. Estás en lo correcto en cuanto a que o.hasOwnProperty ('prototipo') devolvería verdadero. –

2

te hicieron subir "JavaScript de Crockford: las partes buenas. "

Nueva es una parte mala. Página 114. No lo uso. (Bueno, casi nunca.)

Crockford lo usa (en su método de beget()).

Definitivamente no lo use cuando se puede usar algo más. Crear objetos y matrices con literales de objeto y matriz.

+1

Haha. En realidad, para un libro con "The Good Parts" en el título hay una gran cantidad de discusión sobre todas las partes malas (como en, la mayoría del libro). Gracias por la respuesta. –

+2

Solo para aclarar el uso en 'beget' para aquellos que no han leído el libro, ya que no hay una forma (estándar) de establecer el prototipo de un objeto,' new' es la única forma de hacerlo. La función 'beget' usa' new' para crear un objeto con un prototipo especificado. ECMAScript 5 tendrá una función incorporada llamada 'Object.create' que hace lo mismo. –

1

Aquí hay un excelente artículo sobre la implementación de la típica estructuración OO de prototype.js. Esto no sería posible sin el operador "nuevo".

http://prototypejs.org/learn/class-inheritance

recomiendo encarecidamente la lectura de la fuente prototype.js. jQuery es increíble, y muy popular, pero algunas de las cosas que se han hecho en el prototipo sólo hay ninguna comparación ** en otras partes, en particular, su estructuración clase.

** Algunas personas podrían argumentar que parte del prototipo no debería encontrarse en otra parte, esa es una pregunta diferente. Pero para una comprensión total de lo que es posible con JavaScript, el prototipo es el camino a seguir, en mi humilde opinión.

2

No hay nada de malo con el operador new.Para mí, Crockford no es convincente en el tema. Siempre que cree un objeto, usará new en algún lugar de su código o lo usará implícitamente creando literales (por ejemplo, literales de objetos como {a: 1} o literales de matriz como [a, b, c]).

+0

Eso no es para nada cierto Tim. Como dije, he logrado hacerlo bien sin eso. Usas un cierre en su lugar. –

+0

@George: ¿Podría mostrar un ejemplo? –

+0

@Tim Aquí va: http://pastebin.com/f1d6664e0 cada vez que llama a NotificationsDisplay() recupera un objeto/función con sus propias variables privadas, métodos e incluso un método público. –

Cuestiones relacionadas