tags:

views:

55

answers:

3

Hai,

I am trying to understand few concepts in JavaScript. Consider the following code:

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();

I want to call the implementation of 'printStr' in Person class from within the implementation of 'printStr' function in 'p'.

such that the output should be:

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

Any ideas? :)

+2  A: 

As far as I know there is no real subclassing in JS so to do this you should probably save the old function and then replace it.

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

unless you save Person's printStr you can always create a temp Person object solely to extract printStr and call it:

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

but I guess you'll be better off if you make Person's original printStr accessible via prototype:

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

then you have no need for temp object or saving old function and can do:

Person.prototype.printStr.apply(this);
catwalk
+3  A: 

The way your code is set up now, you can't do it. When you call Person as a constructor, the object that ends up being p gets set to this. So when you define printStr in the constructor, p gets an attribute called printStr. You then over-write it when you assign the second function.

Two options: A non-answer is to do what pablochan did - have the internal one be called oldPrintStr. Another option is to use the prototype inheritance:

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 + " >");
};

Then you can do this:

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