Hai

Estoy tratando de entender algunos conceptos en JavaScript. Considere el siguiente código:

function Person(name, age)
{
    this.name = name || "no name";
    this.age = age || "age not specified";
    this.printStr = function()
    {
        console.log("< " + this.name + ", " + this.age + " >");
    };
}

p = new Person("pranav", 26);
p.printStr = function()
{
    console.log("this works. also ...." + this.name);
};
p.printStr();

Quiero llamar a la implementación de 'printStr' en la clase Persona desde dentro de la implementación de la función 'printStr' en 'p'.

Tal que el resultado debería ser:

< pranav, 26 >
this works. also ....pranav

¿Algunas ideas? :)

0
sv_in 7 dic. 2009 a las 12:24

3 respuestas

La mejor respuesta

La forma en que está configurado su código ahora, no puede hacerlo. Cuando llama a Person como constructor, el objeto que termina siendo p se establece en this. Entonces, cuando define printStr en el constructor, p obtiene un atributo llamado printStr. Luego lo sobrescribe cuando asigna la segunda función.

Dos opciones: una no respuesta es hacer lo que hizo pablochan: que la interna se llame oldPrintStr. Otra opción es usar el prototipo de herencia:

function Person(name, age)
{
    this.name = name || "no name";
    this.age = age || "age not specified";
}
Person.prototype.printStr = function() {
    console.log("< " + this.name + ", " + this.age + " >");
};

Entonces puedes hacer esto:

p = new Person("pranav", 26);
p.printStr = function()
{
    Person.prototype.printStr.apply(this);
    console.log("this works. also ...." + this.name);
};
p.printStr();
3
Claudiu 7 dic. 2009 a las 09:44

Hasta donde sé, no hay subclases reales en JS, por lo que para hacer esto, probablemente debería guardar la función anterior y luego reemplazarla.

p = new Person("pranav", 26);
p.oldPrintStr = p.printStr;
p.printStr = function()
{
    p.oldPrintStr();
    console.log("this works. also ...." + this.name);
};
p.printStr();
2
pablochan 7 dic. 2009 a las 09:39

A menos que guarde printStr de Person, siempre puede crear un objeto Person temporal únicamente para extraer printStr y llamarlo:

p.printStr = function()
{
    print("this works. also ...." + this.name);
    (new Person()).printStr.apply(this);
};

Pero supongo que estará mejor si hace que el printStr original de Person sea accesible a través de un prototipo:

Person.prototype.printStr = function()
    {
        print("< " + this.name + ", " + this.age + " >");
    };

Entonces no tiene necesidad de un objeto temporal o guardar una función antigua y puede hacer:

Person.prototype.printStr.apply(this);
0
catwalk 7 dic. 2009 a las 09:43