2012-05-14 43 views
4

如何從構造函數中刪除一個函數?如何從構造函數中刪除一個函數?

如果Person構造函數中有一個叫做greet的函數,該如何刪除該函數?

function Person(name) 
{ 
    this.name = name; 
    this.greet = function greet() 
    { 
     alert("Hello, " + this.name + "."); 
    }; 
} 

我想要得到的結果是:

function Person(name) 
{ 
    this.name = name; 
} 
+1

[如何從javascript對象中刪除屬性]的可能重複(http://stackoverflow.com/questions/208105/how-to-remove-a-property-from-a-javascript-object) –

回答

2

您無法更改函數的來源。如果你想改變該功能的行爲,你必須選擇:

覆蓋你自己的功能。如果函數是獨立的,這很容易。那麼你真的可以只定義

function Person(name) 
{ 
    this.name = name; 
} 

定義原有的功能之後。但是如果涉及到原型和繼承,那麼獲取對原始原型的引用可能會非常棘手(因爲如何評估函數聲明)。

Ceate的包裝功能它創建和實例,並刪除你不想要的屬性:

function PersonWrapper(name) { 
    var p = new Person(name); 
    delete p.greet; 
    return p; 
} 

這種方法也有限,因爲你只能改變什麼從外部訪問。在你提供的例子中,雖然它已經足夠了。

4
delete this.greet 

var personInstance = new Person(); 
delete personInstance.greet // to remove it from the instance from the outside 

delete Person.prototype.greet // if doing prototypes and inheritance 

delete是您很少看到的關鍵字,但我向您保證,它存在:P

+2

Surely你的意思是'刪除personInstance.greet',而不是'刪除Person.greet'(該函數沒有'greet'屬性)。 –

+0

如果我想在沒有實例時從構造函數中刪除,該怎麼辦? – XP1

+1

@ XP1:如果沒有實例,那麼'this.greet'不存在,因爲構造函數從未執行過。所以在這方面你的問題沒有多大意義。也許你想編輯源代碼或用你自己的函數覆蓋'Person',它不包含這個部分。 –

相關問題