2011-08-05 18 views
5

¿cuál es la mejor práctica para utilizar estos?Javascript literal vs función oop

var x = { a: 'a', eat: function() { }, ... } 

vs

var x = function() { var a = 'a'; this.eat = function() { }} 

las necesidades anteriores al iniciarse:

new x(); 

Alguien puede ayudar a explicar la importancia de los dos, y que uno se prefiere elegir dentro de la comunidad oop ? cualquier palabra de sabiduría ayudaría. También investigué pero no salió nada. mucho pensamiento es apreciado

Respuesta

4

La diferencia básica es que la primera versión expone la variable 'a', mientras que la segunda la oculta. Por lo tanto, a menos que desee o necesite código de cliente para acceder al x.a, se prefiere la segunda versión.

Un tercer enfoque sería utilizar un prototipo. En este caso, una variable local en el constructor no le hará mucho bien, así que si eat() necesita tener acceso a a, entonces usted escribiría:

function x() { 
    this.a = 'a'; 
} 

x.prototype.eat = function() { 
    // do stuff with this.a 
} 

En este caso, cada instancia tiene una nueva copia de a, pero solo hay una copia de eat. El inconveniente (si lo considera uno) es que a está disponible para usuarios de x instancias.

+0

Sin embargo, la 2da versión no permite el uso de [[prototype]] (que el 1er * podría * convertirse trivialmente en) - con el 2do acercamiento cada 'eat' será un nuevo objeto de función con un nuevo enlace [[scope chain]]. Generalmente prefiero usar el [[prototipo]]. –

+0

sí, pero él siempre puede hacer 'var x = (función() {var a = 'a'; return {comer: función() {}};}());' –

+0

puede dar un ejemplo de cómo el prototipo se vería así? –

3

El primero solo creará un único objeto, no puede usarlo con la palabra clave new. El segundo contiene una variable local a en lugar de crear una propiedad como la primera.

Las funciones se escriben normalmente como funciones con nombre en lugar de funciones anónimas asignados a las variables:

function x() { 
    this.a = 'a'; 
    this.eat = function() {}; 
} 

Ahora puede crear objetos de usarlo:

var y = new x(); 

Otra forma de métodos que especifican para el objeto es para ponerlo en el prototipo:

function x() { 
    this.a = 'a'; 
} 

x.prototype.eat = function() {}; 
+0

En realidad, las "funciones anónimas asignadas a las variables" se llaman expresiones de función, y son bastante comunes. –

+0

@Bradley Staples: No, una * expresión de función * no es una función * anonymus asignada a una variable *, la función anónima es una forma de expresión de función, por lo que una * función anónima asignada a una variable * es una forma de * expresión de función asignada a una variable *. Aunque es bastante común, las funciones nombradas son mucho más comunes. – Guffa

2

Generalmente d epend en lo que estás tratando de conseguir. Recuerde que JS no tiene clases reales, su lenguaje basado en prototipos. El operador new es bastante engañoso.

Sugeriría usar literal {} siempre que sea posible. En el ejemplo, se puede hacer así:

var myconstr = function(param){ 
    var pr = 'some private var'; 
    return { 
     a : param, 
     get2a : function(){ return this.a; } 
    }; 
}; 

Si desea sólo una instancia, siempre se puede llamar a esta función justo después de definirla.

PERO si desea utilizar prototype, podría ser más fácil con la función Construcción, pero igual, no usaría el nuevo operador tal como está, tal vez sería mejor incluirlo en alguna otra función.