我试图了解私有和受保护的属性在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;
我是否只是语法错误,或者无法从私有方法调用受保护的方法?
答案 0 :(得分:1)
要理解为什么会发生这种情况,首先您需要了解对象的每个部分。
函数test_prot
是Test
对象的属性。与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中的闭包!