2014-03-31 144 views
1

快速問題。Javascript:無法從私有方法訪問公共道具

我一直在使用jQuery(適量)很長一段時間,但我從來沒有真正使用過「類」(泛指)很多經驗。

這裏是我的測試「類」,可在http://jsfiddle.net/TxUs2/

function MyClass(prop) { 
    this.prop = prop; 

    var init = function() 
    { 
     alert(this.prop); 
    } 

    init(); 
} 

var myClass = new MyClass(); 

我希望init()方法是私有的。請有人簡單解釋爲什麼我無法通過私人方法訪問公共財產?

我假設它是與「這個」基本指向方法本身從法中,並沒有包含它的函數(或「類」)。我如何解決這個問題?

非常感謝提前。

編輯:非常感謝您的所有輸入。所有的答案都很好。 :)

回答

3

問題是,當您調用init它被稱爲沒有上下文,因此this不是指MyClass的實例。您可以通過保存在構造函數中this參考解決這個問題,呼籲initthis上下文或結合initthis

  • 保存參考this

    function MyClass(prop) { 
        this.prop = prop; 
    
        var that = this; 
        var init = function() { 
         alert(that.prop); 
        } 
    
        init(); 
    } 
    
  • 調用initthis背景:

    init.call(this); 
    
  • 綁定initthis(這使得每個呼叫的行爲很像0​​):

    var init = function() { 
        alert(this.prop); 
    }.bind(this); 
    
    init(); 
    
+2

注意['Function.prototype的。綁定'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)是一個新的JavaScript功能,所以IE8等舊版瀏覽器不支持它。 – ajp15243

+1

[本頁]有一個方便的polyfill(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)。 – Andy

3

在你當前的代碼,init()是一個 「自由」 的功能。如果自然地調用它,this將在其內部設置爲全局對象(或在嚴格模式下設置爲undefined)。

你可以把它的方法通過寫

this.init = function() { 
    alert(this.prop); 
}; 

this.init(); 

或者你可以使用call()apply()提供在通話時的背景:

var init = function() { 
    alert(this.prop); 
}; 

init.call(this); 
相關問題