2009-08-08 14 views
10

Código 1:¿Cuál es la diferencia entre estos dos ejemplos de código?

var Something = { 
name: "Name", 
    sayHi: function(){ 
    alert(Something.name); 
    } 
} 

Código 2:

function Something(){ 
    this.name = "Name"; 
} 

Something.prototype.sayHi = function(){ 
    alert(Something.name); 
} 

Editar: Así que, chicos, que quiere decir que el segundo es mejor? o más "formal"?

+0

Esto también es una buena pregunta para mí, gracias por publicar. –

+0

En lo que respecta a su pregunta en la edición, depende de lo que desea hacer. Si solo tiene una copia del objeto, busque la primera sintaxis. Si desea crear copias múltiples (como si 'Something' fuera una 'Clase' en otros idiomas), busque la segunda sintaxis (o en realidad, una versión editada en la que defina 'sayHi' dentro del constructor usando' this.sayHi = function() {...} ', esta es la norma). –

Respuesta

8

Básicamente en el primer ejemplo declaras object literal que en realidad ya es una instancia de objeto.

En su segundo ejemplo, define una función de constructor que se puede usar con el operador new para crear instancias de objetos.

Los literales de objetos también se pueden usar para crear nuevas instancias de objetos y hacer herencia de prototipos, Douglas Crockford también promueve esta técnica.

Básicamente, usted puede tener un operador object:

function object(o) { 
    function F() {} 
    F.prototype = o; 
    return new F(); 
} 

Esta función auxiliar se puede utilizar de una manera muy intuitiva y conveniente.

Básicamente recibir un objeto como parámetro, dentro de la función se crea una instancia de nuevo objeto, el antiguo objeto es encadenados al prototipo del nuevo objeto, y su regreso.

Puede ser utilizado como esto:

var oldObject = { 
    firstMethod: function() { alert('first'); }, 
    secondMethod: function() { alert('second'); }, 
}; 

var newObject = object(oldObject); 
newObject.thirdMethod = function() { alert('third'); }; 

var otherObject = object(newObject); 
otherObject.firstMethod(); 

Usted puede ir más lejos como quiera, haciendo nuevas instancias de los objetos previamente definidos.

Recomendado:

+0

Usar 'Object (Something)' no es lo mismo que usar la palabra clave 'new'. En particular, si cambia cualquier propiedad en el primer caso, se cambiará globalmente. Por ejemplo 'Object (Something) .name =" new name "' lo cambia por Something, mientras que '(new Something()). Name =" new name "' solo lo cambia por esa _instance_ particular. –

+0

Sí, lo siento, estaba pensando en el operador 'objeto' descrito en este artículo ... http://javascript.crockford.com/prototypal.html – CMS

+0

@Sinan, muy editado ... no he dormido en 24 horas: -) ... – CMS

7

En el primer fragmento de código, Something es un objeto simple, y no un constructor. En particular, no puede llamar a:

var o = new Something(); 

Tal forma de crear objetos es perfecta para singletons; objetos de los cuales solo necesitas una instancia.

En el segundo fragmento, Something es un constructor, y se puede utilizar la palabra clave new con él.

Editar:

Además, en el segundo fragmento, dado que está utilizando Something.name en contraposición a this.name, será siempre alertar al nombre del constructor de sí mismo, que es "Algo", a menos que anula esa propiedad con algo como Something.name = "Cool";.

Probablemente querían esa línea que decir:

alert(this.name); 
1

En primer ejemplo que puede hacer

Something.sayHi(); 

mientras que en el segundo hay que hacerlo

new Something().sayHi(); 
Cuestiones relacionadas