2011-08-19 24 views
8

Hoy vi un patrón de JavaScript que nunca había visto en toda mi vida. No puedo decir el propósito de usar este patrón. Me parece mal, pero quiero ser un poco conservador. Puede ser un patrón impresionante que nunca antes vi.Definición de métodos prototipo dentro del constructor

function Dog() { 
    Dog.prototype.bark = function() { 
     alert('woof!'); 
    } 

    this.bark = function() { 
     Dog.prototype.bark(); 
    } 

    this.bark(); 
} 

En primer lugar, no soy un ventilador para hacer métodos (como miembros privilegiados) dentro del constructor por ninguna razón. Causaría crear funciones cada vez que se crea una instancia. En segundo lugar, en este fragmento de código, también llama al nombre del prototipo "Perro", en lugar de "este". Esto me hace muy confundido.

¿Alguien sabe de qué sirve?

Gracias! Grace

+1

Eso parece extremadamente inútil. Por lo que sé, el objeto prototipo se usa para agregar propiedades a todas las instancias de un objeto fuera de la definición. Como eso está en la definición, es un poco redundante. – mowwwalker

+0

Estoy totalmente de acuerdo contigo. A mí también me parece sin sentido. –

Respuesta

12

Esta es una muy mala idea, por una gran cantidad de razones. Algunos de los cuales son:

  1. Agregar métodos al prototipo en el constructor hará que el método prototipo sea reemplazado para todas las instancias, cada vez que cree una instancia de un nuevo Perro.
  2. Llamar a Dog.prototype.bark() significa que this será Dog.prototype y no su instancia de Dog, que puede causar problemas graves.
  3. this.bark = function() { Dog.prototype.bark(); } es algo serio WTF. Porque this.bark ya evaluará el método de prototipo haciendo que esto sea innecesario. Y llamarlo así en realidad destruye el valor natural this, como se menciona en el n. ° 2.

Aquí es lo que debe ser:

function Dog() { 
    this.makeSound(); 
}; 

Dog.prototype.bark = function() { 
    alert('woof'); 
}; 

Dog.prototype.makeSound = function() { 
    this.bark(); 
}; 

O, alternativamente, sin el prototipo en todo:

function Dog() { 
    this.bark = function() { 
    alert('woof'); 
    }; 

    this.makeSound = function() { 
    this.bark(); 
    }; 

    this.makeSound(); 
}; 

yo no confiaría en este fragmento de la suya en absoluto.

+0

# 2: eso es lo mismo, incluso si la corteza se inicializa fuera del constructor; el método * this * lo establece la llamada. # 3: lo mismo que # 2 (* this * será * Dog.prototype *), pero la función no usa * this *, por lo que no causará problemas en este caso. – RobG

+0

¿Por qué harías 'this.makeSound = function() {}'? Este ejemplo podría ser engañoso sin aclaración. Esto no se establece en el objeto prototipo y la función se duplica en la memoria para cada instancia de 'new Dog();'. Mejor para 'Dog.prototype.makeSound = function() {}' – dman

2

Lo siento por la propia respuesta tardía, pero si realmente desea agregar los prototipos en el constructor y no tener que volver a crear cada vez que se crea una nueva instancia, se puede hacer esto:

function Dog() { 
    if (!Dog.prototype.bark) { 
     Dog.prototype = function() { 
      console.log('woof'); 
     } 
    } 

    this.bark(); 
} 

Todavía probablemente no utilizaría este método, pero tengo algunas instancias en las que este método era una opción cuando se trata de marcos de terceros (el tipo dudoso).

Cuestiones relacionadas