如何从被替换的实现中调用类中的方法?

时间:2009-12-07 09:24:35

标签: javascript oop

我试图理解JavaScript中的一些概念。请考虑以下代码:

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

我想在'p'中'printStr'函数的实现中调用Person类中'printStr'的实现。

这样输出应该是:

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

有什么想法吗? :)

3 个答案:

答案 0 :(得分:3)

现在设置代码的方式,你不能这样做。当您将Person作为构造函数调用时,最终为p的对象将设置为this。因此,当您在构造函数中定义printStr时,p会获得一个名为printStr的属性。然后在分配第二个函数时重写它。

两个选项:非答案是做pablochan所做的 - 让内部的一个叫做oldPrintStr。另一种选择是使用原型继承:

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

然后你可以这样做:

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

答案 1 :(得分:2)

据我所知,JS中没有真正的子类,所以你应该保存旧函数然后替换它。

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

答案 2 :(得分:0)

除非你保存Person的printStr,否则你总是可以创建一个临时Person对象来提取printStr并调用它:

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

但是如果您通过原型访问Person的原始printStr,我想你会更好:

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

那么你不需要临时对象或保存旧功能,可以这样做:

Person.prototype.printStr.apply(this);