9

tiendo a escribir objetos constructores de la siguiente manera:¿Cuál es la ventaja de usar este patrón de codificación de JavaScript para definir las funciones del constructor?

function Person(name) { 
    this.name = name; 
} 
Person.prototype.greet = function() { 
    alert("Hello! My name is " + this.name + "."); 
}; 

me he dado cuenta de algunas bibliotecas de JavaScript y marcos añadiendo un poco de código extra alrededor de ese modo:

var Person = (function() { 
    function Person(name) { 
     this.name = name; 
    } 
    Person.prototype.greet = function() { 
     alert("Hello! My name is " + this.name + "."); 
    }; 
    return Person; 
})(); 

Yo sé lo que el función anónima autoejecutable hace y se utiliza para. Lo que no veo en este momento es qué ventaja o beneficio proporciona al definir un constructor y su prototipo.

editar # 1:

sé que el patrón de módulo y sus ventajas, y lo utilizan con bastante frecuencia en mi codificación. Mi error de comunicación no fue claro que mi primera muestra de código no se supone que esté en el alcance global. Siempre envuelvo todos mis archivos JavaScript externos en una función anónima autoejecutable para aplicar el alcance local en el código.

Por ejemplo:

;(function (window, undefined) { 
    var p = function (name) { 
     this.name; 
    }; 
    p.prototype.greet = function() { 
     alert("Hello! My name is " + this.name + "."); 
    }; 
    window.Person = window.Person || p; 
})(window); 

Lo que pasa es que he visto la técnica que se muestra en mi segundo ejemplo de código utilizado dentro una función tan anónimo.

Por ejemplo:

;(function (window, undefined) { 
    var p = (function() { 
     var q = function (name) { 
      this.name = name; 
     }; 
     q.prototype.greet = function() { 
      alert("Hello! My name is " + this.name + "."); 
     }; 
     return q; 
    })(); 
    window.Person = window.Person || p; 
})(window); 

Aquí es donde yo estoy en una pérdida de la importancia de la técnica.

+0

En este ejemplo específico, no hay diferencia. Creo que para una clase más complicada, podría importar, dependiendo de lo que el framework esté haciendo dentro del alcance extra. – Domenic

+0

@Domenic - El tuyo responde a la respuesta que estaba esperando. Me pregunto si alguien podría elaborar más sobre esto. – natlee75

Respuesta

1

El segundo método, el patrón del módulo, es más portátil. Observe que puede nombrar Person a cualquier cosa que desee.

En el primer método, debe realizar un seguimiento de cada aparición de Person, y tener cuidado de no eliminar accidentalmente parte del método al copiar el constructor + prototipo a otro proyecto.

El segundo método tiene una ventaja adicional: puede usar variables locales/temporales/desechables que se pueden usar para definir dinámicamente constantes/métodos/propiedades en el espacio de nombres.

1

Es efectivamente un espacio de nombre ¿no?

+0

¿No estoy seguro de por qué obtuve un voto a favor? Fue mi respuesta incorrecta? – crush

+0

No, tienes razón. Y esto es a menudo para lo que se usa este patrón; para evitar contaminar el espacio de nombres global envolviendo todo en un cierre. – Howard

+0

Na, yo diría que hay una diferencia entre "espacio de nombres" y "cierre". Por supuesto, el objeto ventana es algo así como un espacio de nombres, y puede usar cierres para rellenar espacios de nombres, pero no en estos ejemplos. – Bergi

0

Preferente primera solución, menos código más claro para mí.

veo la segunda mejor solución sólo si copiar y pegar el código de frecuencia a otra biblioteca, pero no creo que esto es una buena razón

0

Esta es la respuesta que mi compañero de trabajo, que tiene una conocimiento extraordinario no solo de JavaScript sino de cómo funcionan todos los diversos motores de JavaScript en los navegadores, me dijo que este patrón de código es una forma innecesaria y demasiado defensiva de definir objetos que se usa para tratar fallas en ciertos analizadores de JavaScript (específicamente citó versiones de Opera) que permiten la fluencia del alcance. Ciertamente suena como una respuesta razonable ...

Cuestiones relacionadas