Tengo esta función constructora básica (con dos entradas)
function Person(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; }
Para crear un objeto con la función constructora Persona , hago
var person1 = new Person("John", "Doe");
si quiero agregar una nueva propiedad al objeto persona1 ( edad , por ejemplo), lo hago
person1.age = 20;ahora, quiero crear un nuevo objeto con la misma función de constructor... digamos person2 . Como sé su edad, también quiero agregar esta información al objeto. lo hago asi
var person2 = new Person("Jennifer", "Unknown", 30);la salida viene sin la propiedad de edad , porque la función constructora Person no lo sabe
Para crear el objeto person2 con esas 3 entradas usando Person , debo redefinir Person (con esas 3 entradas) y recrear person2 , pasando esas 3 informaciones o agregar la información adicional si el objeto ya existe...
Mi pregunta es:
¿Cómo proceder, si quiero agregar un tercer objeto con Persona ( persona3 ), pasando 4 entradas ( nombre , apellido , edad , nacionalidad )? ¿Tengo que redefinir Person (nuevamente) y luego crear person3 ? ... ¡Esto parece un trabajo tedioso y sin lógica! ¡Confieso que soy un novato en jS!
¿Hay alguna forma de editar una función de constructor sin redefinirla cada vez que quiero crear un nuevo objeto con propiedades adicionales? ¿Puedo agregar una nueva propiedad a las funciones de un constructor sin redefinirla? ¿Y si quiero editar una función constructora para agregar un método? por ejemplo:
status = function(){ alert(this.firstName + " " + this. lastName + " " + ", a person with" + " " + this. age + " " + "years old" + " " + "was found nearby doing jS stuff!" )}resumiendo... mi objetivo es:
Comienzo con start y quiero terminar con end sin redefinir Person , solo editándolo.
Mi pregunta tiene sentido? Agradezco cualquier consejo.
Bueno, no existe tal cosa como "editar" una función, pero puede reutilizar la implementación anterior para definir su nueva función en lugar de reescribirla por completo.
function Person(firstName, lastName) { this.firstName = firstName this.lastName = lastName } Person.prototype.speak = function () { console.log('hey!') } p1 = new Person('first1', 'last1') console.log('p1 firstName', p1.firstName) p1.speak() // hey! // store old prototype object oldPrototype = Person.prototype Person = function (firstName, lastName, age) { // call the old constructor to initialize with existing properties oldPrototype.constructor.call(this, firstName, lastName) // assign new properties this.age = age // assign a new default property this.otherProp = 'new prop' } // copy over the old prototype to the new Person Person.prototype = oldPrototype p2 = new Person('first2', 'last2', 10) console.log('p2 firstName', p2.firstName) console.log('p2 new properties', p2.age, p2.otherProp) // 10 and 'new prop' p2.speak() // should work! because we already copied the old prototype object over // it will not affect any of the old Person instances that were initialized before console.log('p1 age', p1.age) // undefined console.log('p1 otherProp', p1.otherProp) // undefinedSi bien esto es posible, ¡no lo use en exceso!
Porque parece un antipatrón para anular una función constructor . Debería crear una nueva constructor function extendiendo su Person en su lugar.
Leer más sobre Herencia en JavaScript