Estoy tratando de aplicar herencia prototipada a una función en Javascript. Todo es bastante simple e incluso se describe en Wikipedia's javascript lemma. Funciona si mis propiedades son tipos simples javascript:javascript prototyped inheritance and object properties
function Person() {
this.age = 0;
this.location = {
x: 0,
y: 0,
absolute: false
};
};
function Employee() {};
Employee.prototype = new Person();
Employee.prototype.celebrate = function() {
this.age++;
}
var pete = new Employee();
pete.age = 5;
pete.celebrate();
var bob = new Employee();
bob.celebrate();
console.log("bob is " + bob.age + " pete is " + pete.age);
Con Employee.prototype = new Person();
, todas las propiedades de la persona y (prototipos) métodos son heredados por los empleados, que es fundamental para la herencia.
Esto funciona como se esperaba: bob is 1 pete is 6
Ahora estoy empezando a jugar con la ubicación de Pete (después de celebrar)
pete.celebrate();
pete.location.absolute=true;
Viendo bob.location.absolute muestra: true
, que está contraindicado intuitiva (No toqué la ubicación de Bob, así que espero que tenga el valor inicial declarado en Person
) y arruine mi solución.
En mi comprensión inicial esto debería haber sido falso. Me doy cuenta de que probablemente debería clonar el objeto de ubicación de la persona inicial, pero no estoy seguro de dónde o cómo hacerlo. Y si hay quizás mejores técnicas para la herencia?
¿Cuál es la ventaja de usar createObject (Person) en lugar de nueva Person()? Solo agrega una capa de prototipo de indirección. – Kosta
@Kosta para evitar los efectos secundarios de ejecutar un constructor al heredar. Los constructores usualmente tienen un código de inicialización que no quieres ejecutar cuando no estás instanciando nada. un 'nuevo empleado' seguirá siendo' instancia de persona' porque tanto 'Person.prototype' como' f.prototype' apuntan al mismo objeto. – Esailija
Pero todavía está ejecutando el constructor en createObject() (una vez). Además, está ejecutando el constructor en Employee() (en cada creación de instancias). ¿Podría dar un ejemplo donde createObject() es útil? – Kosta