海
我试图理解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
有什么想法吗? :)
答案 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);