考慮下面的代碼:「特權」的方法調用成員方法問題
function Dog()
{
this.foo = function() {};
this.walk = function()
{
if(canWalk())
{
alert('walking');
return;
}
alert('I have no legs!');
}
canWalk = function()
{
this.foo();
return false;
}
}
var instance = new Dog();
instance.walk();
有與「特權」 canWalk()
方法假設this
指針指向的Dog
的實例代碼中的錯誤。它實際上似乎指向令我困惑的全球對象!我讀過,由於閉包,我可以在構造函數的範圍內獲取對this
的引用,然後在我的「特權」方法中使用該引用,但這看起來像是一種破解。
我只是幾乎不知道在各種情況下的指針this
的行爲。我明白,「附加」到對象的方法將收到指向附加對象的this
。例如,foo.doStuff()
將有一個指向foo
實例的this
。
令人不安的是,雖然我認爲自己很聰明,並在我的OBJECT上創建了「特權」方法,但看起來我正在將函數轉移到全局範圍!也許有一種叫做init()
的全局方法(很可能)來自另一個庫或文件,而不是我自己創建的。如果我然後用一個名爲init()
的「特權」方法定義了一個很好的小封裝對象,我將替換其他全局方法init()
。
我的問題是,創建「特權」方法(和領域爲這個問題)的最佳做法是範圍的對象,他們打算屬於?對於我的示例對象,還有其他哪些方法可以提供私有或特權方法,同時還可以正確使用範圍。我不是在尋找滿足要求的晦澀解決方案,而是尋求最佳實踐。
我無法弄清楚如何編輯我原來的職位,但我意識到我犯了一個不幸的錯誤,並沒有粘貼正確的示例代碼。 這裏有一個來自canWalk()方法的「foo」方法的調用,所以canWalk()基本上調用了this.foo()。 對不起混淆 – 2011-06-10 23:23:09
啊,我明白了。在這種情況下,'this'可能指向'canWalk'函數。在我的例子中,如果你使用'self.foo',你會沒事的。並且可能有編輯按鈕:) – Halcyon 2011-06-10 23:24:46
@Steve您可以通過點擊文本左下角藍色標籤下方的「編輯」編輯自己的帖子。我試着用你所描述的更新代碼,但有點不清楚。 – ErikE 2011-06-10 23:33:00