Soy nuevo en Javascript y estoy aprendiendo sobre objetos. Aprendí que puedes agregar una nueva propiedad o método a un objeto con prototipo.
function Person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; } Person.prototype.nationality = "English";
Ahora me pregunto si también es posible agregar una nueva propiedad con un nuevo parámetro sin asignar directamente la nueva propiedad o cambiar el constructor del objeto. Entonces, se convierte en:
function Person(first, last, age, eyecolor, nationality) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; this.nationality = nationality; }
Puede hacer esto envolviendo el constructor original en una nueva función, como esta:
const originalPerson = Person; Person = function(first, last, age, eyecolor, nationality) { const instance = new originalPerson(first, last, age, eyecolor); instance.nationality = nationality; return instance; };
Ejemplo en vivo:
function Person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; } const originalPerson = Person; Person = function(first, last, age, eyecolor, nationality) { const instance = new originalPerson(first, last, age, eyecolor); instance.nationality = nationality; return instance; }; const joe = new Person("Joe", "Bloggs", 42, "brown", "English"); console.log(joe.nationality);
También puedes hacerlo vía herencia:
const originalPerson = Person; Person = class extends originalPerson { constructor(first, last, age, eyecolor, nationality) { super(first, last, age, eyecolor); this.nationality = nationality; } };
Ejemplo en vivo:
function Person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; } const originalPerson = Person; Person = class extends originalPerson { constructor(first, last, age, eyecolor, nationality) { super(first, last, age, eyecolor); this.nationality = nationality; } }; const joe = new Person("Joe", "Bloggs", 42, "brown", "English"); console.log(joe.nationality);
En ambos casos, reasigné Person
, pero no tiene que hacer eso, simplemente puede usar ExtendedPerson
o algo así:
class ExtendedPerson extends Person { constructor(first, last, age, eyecolor, nationality) { super(first, last, age, eyecolor); this.nationality = nationality; } }
... y luego use new ExtendedPerson(/*...*/)
.
Ejemplo en vivo:
function Person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; } class ExtendedPerson extends Person { constructor(first, last, age, eyecolor, nationality) { super(first, last, age, eyecolor); this.nationality = nationality; } } const joe = new ExtendedPerson("Joe", "Bloggs", 42, "brown", "English"); console.log(joe.nationality);