私人函数调用保护功能?

时间:2015-12-07 16:19:35

标签: javascript

我试图了解私有和受保护的属性在javascript中的工作方式。

我已经掌握了一般的想法,并且正在玩各种属性之间进行测试。

到目前为止,我发现:

  • 公众可以致电受保护的
  • 受保护可以致电私人
  • 公众不能打电话给私人
  • 私人可以致电公共
  • 受保护可以调用公共

到目前为止一切顺利,但是当我尝试将私有函数调用为受保护函数时,我得到一个未定义的错误。

test.js:

var Test = require('./test_.js'),
    test = new Test();

test.prot_func();

test_.js:

function publ_func() {
    console.log('Public');
}

function Test() {
    var priv_var = 0;

    this.prot_func = function prot_func() {
        //OK
        console.log('Protected');
        priv_func();
    };

    function priv_func() {
        //OK
        console.log('Private');
        //OK
        //publ_func();
        test_prot();
        //test_prot is not defined?
        //Also tried: this.test_prot();
    }

    this.test_prot = function test_prot() {
        console.log('Protected');
        publ_func();
    };
}

Test.prototype.publ_func = publ_func;

module.exports = Test;

我是否只是语法错误,或者无法从私有方法调用受保护的方法?

2 个答案:

答案 0 :(得分:1)

要理解为什么会发生这种情况,首先您需要了解对象的每个部分。

函数test_protTest对象的属性。与prot_func相同。

但是,priv_func常规函数,它只是在Test对象的范围内定义。基本上,该功能与您的对象并不真正相关

这就是为什么当你调用test_prot时它是未定义的,因为它是Test的属性而你没有给它一个调用对象。

function priv_func() {
    test_prot(); // <--- there is no calling object, even though this is a property of Test
};

因此,如果您想在该函数中调用test_prot,则需要为其提供一个调用对象。像这样的东西会起作用:

...
// Define a reference to Test object within scope of Test
var self = this;
...

function priv_func() {
    self.test_prot(); // <--- now it has a calling Test object, and will work
};

答案 1 :(得分:0)

尝试:

function Test() {
    var priv_var = 0;
    vat that = this;

    this.prot_func = function prot_func() {
        //OK
        console.log('Protected');
        priv_func();
    };

    function priv_func() {
        //OK
        console.log('Private');
        //OK
        //publ_func();
        that.test_prot();
        //test_prot is not defined?
        //Also tried: this.test_prot();
    }

    this.test_prot = function test_prot() {
        console.log('Protected');
        publ_func();
    };
}

并阅读js中的闭包!