Usando “prototipo” para variables

La mayoría de las veces (tutoriales principalmente), he visto “prototipos” utilizados para métodos.

Estoy bastante seguro de que también se puede usar para variables (quizás la más útil para configurar “valores predeterminados”). ¿Hay alguna razón por la que no se usa a menudo para funciones? ¿Es una mala práctica o hay diferencias notables en el rendimiento?

Piénselo al revés: ¿por qué querría almacenar el atributo de un objeto en su prototipo?

Hay dos respuestas:

  1. Guardar la memoria Definir métodos en cada instancia consumiría una cantidad terrible, ya que técnicamente cada instancia tendría su propio método. El costo es considerablemente menor para los tipos de datos simples.
  2. Acceso compartido. Las instancias pueden necesitar compartir el acceso a un atributo común. Sin embargo, esto no es posible para tipos de datos simples, ya que no se almacenan por referencia.

Como mencionó gilly3 , 2. puede suceder accidentalmente si no estás absolutamente seguro de lo que estás haciendo. (Oh sí, me pasó a mí …)

Mejores prácticas:

  • Los métodos van al prototipo.
  • Los atributos van a las instancias, a menos que necesite acceso compartido (y el atributo es de tipo de objeto) .

[editar]

  • El acceso compartido debe implementarse utilizando cierres, no “variables de clase”

[/editar]

Y sí, el rendimiento del uso del prototipo es ligeramente peor que a la inversa. PERO nunca debe tratar de optimizar cosas como esa, ya que la ganancia de rendimiento es casi imperceptible, aunque la legibilidad y la capacidad de mantenimiento de su código pueden sufrir significativamente.

Desde lo alto de mi cabeza, pierdes la funcionalidad de hasOwnProperty() , que puede ser útil si alguna vez estás haciendo un bucle for ... in en tu objeto. Considera estos dos objetos:

 function MyObject() { ... } MyObject.prototype.someProperty = 1; var a = new MyObject(); var b = new MyObject(); b.someProperty = 2; a.hasOwnProperty("someProperty"); // false b.hasOwnProperty("someProperty"); // true 

Eso puede o no puede importar para su situación.

Edición: Pensamiento de otro. Si almacena objetos en su prototipo y una instancia de ese objeto cambia una propiedad en ese objeto, afectará a todas las demás instancias:

http://jsfiddle.net/BbmgP/

 function MyObject() { ... } MyObject.prototype.someProperty = { value: 1 }; var a = new MyObject(); var b = new MyObject(); b.someProperty.value = 2; a.someProperty.value; // 2!! not 1 

El objeto prototipo de JavaScript, introducido a partir de JavaScript 1.1, es un objeto creado previamente que simplifica el proceso de agregar propiedades / métodos personalizados a todas las instancias de un objeto.

Puedes agregar propiedades predeterminadas, aquí hay un ejemplo:

 function myObject() { this.constructor(); } myObject.prototype = { constructor : function () { this.MyProperty1 = "123456"; //default property this.MyProperty2 = "bla"; //default property } }; 

Déjeme saber si esto ayuda…