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.
¿Cuándo me gustaría usar Name.getName = function() {}? – sepiroth
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
'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. –