2009-11-20 25 views
7

¿Qué es un prototipo para una clase de JavaScript? En otras palabras, ¿cuál es la diferencia entre¿Qué son prototipos en JavaScript?

Example.prototype.method {} 

y

Example.method{} 

la hora de definir la clase Ejemplo?

Editar: Para los interesados, he encontrado una gran explicación (además de la respuesta más abajo) aquí por la diferencia entre los métodos de clases y métodos constructores: http://idhana.com/2009/07/13/constructor-vs-class-methods-in-javascript/

Edición 2: La respuesta completa! http://blog.anselmbradford.com/2009/04/09/object-oriented-javascript-tip-creating-static-methods-instance-methods/

Respuesta

5

La diferencia está en el último ejemplo que está creando un método estático, que no se hereda si Example es una función de constructor. Al definir propiedades en la propiedad prototype de una función de constructor y crear objetos con la palabra clave new, los objetos recién creados heredan el prototipo del constructor y, por lo tanto, tienen acceso a esos métodos.

Un ejemplo sería los métodos definidos en la tales como String incorporado en los constructores básicos, .. cadenas de nueva creación tienen un método indexOf porque no había definido en el prototipo del constructor String función

typeof String.prototype.indexOf // 'function' 

var name = 'John'; 
alert(name.indexOf('J')) // 0 

El El siguiente código crea un constructor de funciones, primero definimos un método estático, creamos un objeto, descubrimos que el objeto no tiene un método getName, luego definimos uno en el prototipo y descubrimos que ahora el objeto tiene un método getName.

function Name(name) { 
    this.name = name; 
}; 
Name.getName = function(){}; 

var john = new Name(); 
typeof john.getName // undefined 

var john = new Name(); 
Name.prototype.getName = function(){ alert(this.name)}; 
typeof john.getName 

john.constructor.prototype.getName == john.getName // true 

Así reiterar, la herencia en ECMAScript se logra principalmente mediante la definición de propiedades/métodos en el prototipo de un constructor función, ejemplo podría ser todos los constructores básicos, tales como la fecha/Número/cadena que tiene métodos definidos en su las propiedades de prototipo respectivas, que le permiten usar esos métodos cuando crea una instancia con la palabra clave new.

Recuerde que el objeto recién creado tiene una propiedad constructor que apunta al constructor que lo hizo, y podemos acceder directamente a la propiedad prototype. El objeto john que creamos no posee directamente el método getName, ya que el intérprete no puede encontrarlo directamente en el objeto que recorre hacia arriba al constructor y lo encuentra en su prototipo.

Y, en realidad, no tuvimos que crear una nueva instancia del objeto john, como se indicó en la otra respuesta, puede definir propiedades en el prototipo después de crear el constructor inicial, y todos los objetos heredarían esos prototipos propiedades incluso después de haber sido creadas.

Un método estático no puede depender del contexto, no puede basarse en una instancia específica de una clase, no se puede confiar en la palabra clave this por lo tanto, esto no sería un método estático:

function Name(name) { 
    this.name = name; 
    this.getName = function() { return this.name; } 
}; 

Esto haría ser un ejemplo de un método estático:

Name.getName = function() {}; 

pero no hay absolutamente ningún sentido hacer getName estática ya que como su nombre lo indica, debe depender de una instancia de objeto de determinar cuál es la propiedad del nombre es, usted debe tener más gener ic helper funciona como funciones de análisis como Date.parse como métodos estáticos y define métodos de instancia en el prototipo, ya que son más eficientes que la definición de this.foo = function(){} en el constructor.

+0

¿Cuándo me gustaría usar Name.getName = function() {}? – sepiroth

+0

o mejor dicho, ¿cuándo podría definir métodos (y cómo) para la clase Name sin usar la definición del prototipo? – sepiroth

+0

'getName' sería un método público, por lo que se define en el prototipo en lugar de estático, se definiría un método estático si no hubiera un propósito para hacerlo público o en el prototipo. –

2

Un prototipo es como una definición de Clase, pero se puede cambiar dinámicamente. Cada vez que crea una instancia de un objeto de cierto tipo, utiliza el prototipo como plantilla.

Si cambia un prototipo, los objetos de ese tipo tendrán esos cambios.

Cuestiones relacionadas