He estado jugando con herencia de prototipos después de leer http://javascript.crockford.com/prototypal.html y tengo un pequeño problema para entender cómo podría usarlo de la misma forma que usaría la herencia clásica. A saber, todas las funciones y variables heredadas por el prototipo se vuelven esencialmente estáticas a menos que sean sobrescritas por el objeto hijo. Considere la siguiente:Implementando métodos/variables de instancia en la herencia de prototipales
var Depot = {
stockpile : [],
loadAmmo : function (ammoType) {
this.stockpile.push(ammoType);
}
};
var MissileDepot = Object.create(Depot);
var GunDepot = Object.create(Depot);
stockpile
y loadAmmo
definitivamente debe estar en el prototipo, ya que ambos MissileDepot y GunDepot los tienen. Entonces corremos:
MissileDepot.loadAmmo("ICBM");
MissileDepot.loadAmmo("Photon Torpedo");
alert(MissileDepot.stockpile); // outputs "ICBM,Photon Torpedo"
alert(GunDepot.stockpile); // outputs "ICBM,Photon Torpedo"
Se espera porque ni tampoco MissileDepot
GunDepot
en realidad tienen stockpile
o loadAmmo
en sus objetos, por lo que mira hacia arriba Javascript a la cadena de herencia a su ancestro común.
Por supuesto que podría establecer las existencias de GunDepot manualmente y como se esperaba, el intérprete ya no tiene que buscar la cadena de
GunDepot.stockpile = ["Super Nailgun", "Boomstick"];
alert(GunDepot.stockpile); // outputs "Super Nailgun,Boomstick"
Pero esto no es lo que quiero. Si esto fuera una herencia clásica (digamos Java), loadAmmo operaría en las reservas de MissileDepot y GunDepot de forma independiente, como un método de instancia y una variable de instancia. Me gustaría que mi prototipo declare cosas que son comunes a los niños, no compartidas por ellos.
Así que tal vez estoy malinterpretando por completo los principios de diseño detrás de la herencia prototípica, pero no sé cómo lograr lo que acabo de describir. ¿Algun consejo? ¡Gracias por adelantado!
no debería usar mayúsculas para el nombre de los objetos Depot, MissileDepot, GunDepot. Esto va en contra de las convenciones comunes y dificulta la comprensión. –
Gracias Eric - Lo usé para denotar una clase, como en Ruby/Java/php/whatever. Entonces, para javascript, ¿usamos camel case para TODOS los objetos? ¿Cuál es la regla de oro – ambertch
disculpa por la puntuación, quise decir "¿cuál es la regla de oro?" – ambertch