Javascript:无法从私有方法访问公共道具

时间:2014-03-31 13:07:12

标签: javascript

快速提问。

我已经使用jQuery(适度)很长一段时间了,但我从来没有真正体验过"类" (松散地使用)。

这是我的测试"课程",可在http://jsfiddle.net/TxUs2/获得。

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

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

    init();
}

var myClass = new MyClass();

我希望init()方法是私有的。有人可以简单解释为什么我无法通过私人方法访问公共财产吗?

我假设它与“这个'本质上从方法中指向方法本身,而不是包含函数(或"类")。我该如何解决这个问题?

非常感谢提前。

编辑:非常感谢你的所有投入。所有的答案都很棒。 :)

2 个答案:

答案 0 :(得分:4)

问题在于,当您调用init时,它被调用而没有上下文,因此this不会引用MyClass的实例。您可以通过在构造函数中保存对this的引用,在init的上下文中调用this或将init绑定到this来解决此问题:

  • 保存对this的引用:

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

    的上下文中调用this
    init.call(this);
    
  • init绑定到this(这使得每个调用的行为都像init.call(this)):

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

答案 1 :(得分:3)

在您当前的代码中,init()是一个“免费”功能。如果你自然地调用它,它的主体this将被设置为全局对象(或严格模式下的undefined)。

你可以写一个方法:

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

this.init();

或者您可以使用call()apply()在来电时提供上下文:

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

init.call(this);