2009-12-07 47 views
0

Hai,如何從其替換的實現中調用類中的方法?

我想了解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(); 

我想稱之爲「printStr」的Person類實現從「printStr」功能在「P」的實施範圍內。

使得輸出應該是:

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

任何想法? :)

回答

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

,除非您保存人的printStr你總是可以創建一個臨時Person對象僅提取printStr並稱之爲:

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

,但我想你會好起來的,如果你做的人的原始printStr

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

那麼你就不需要臨時對象或保存舊的功能,可以這樣做::

通過訪問原型
Person.prototype.printStr.apply(this); 
相關問題