JavaScript中私有变量和实例变量的方法和变量范围
我试图弄明白这一点,或者在谷歌上搜索它,我只能找到如何创建对象,而不能确切地找到函数是如何工作的。如果有人能向我解释一下封装是如何工作的JavaScript中私有变量和实例变量的方法和变量范围,javascript,Javascript,我试图弄明白这一点,或者在谷歌上搜索它,我只能找到如何创建对象,而不能确切地找到函数是如何工作的。如果有人能向我解释一下封装是如何工作的 function myObject() { this.variable1 = "tst"; this.function1 = function() { //Now this function works. A 'this' function to a private function is ok _Priv
function myObject() {
this.variable1 = "tst";
this.function1 = function() {
//Now this function works. A 'this' function to a private function is ok
_PrivateFunction1();
//Here is error one, I cannot seem to call methods within the object
//from.
this.function2();
}
this.function2 = function() {
alert("look! function2!");
}
function _PrivateFunction1() {
//This does work though. I am confused.
_PrivateFunction2();
}
function _PrivateFunction2() {
alert("look! PrivateFunction1");
//this does not work.
alert(this.variable1);
}
}
您必须保存实际对象的副本,如注意
var=this
在chrome和FF中进行封装测试,我更喜欢模块模式,如
var someMethod = function(){
var i,
length,
// public method
public = function(num1, num2){
return num1+num2;
},
//private method
_private = function(){};
//exposing the public method
return{
public:public
}
};
var callPublic = someMethod();
callPublic.public(20, 30);// call the public method and return 50
现在,如果您尝试调用私有方法,如
callPublic._private();//it will return not a function since its not been exposed
有很多其他模式可以封装您的方法,但模块模式是最常见的。希望ot能帮助您用javascript封装数据。如果我们按相反的顺序进行,我想我可以更好地解释这一点。首先,我们定义一些函数:
function _PrivateFunction1() {
//This does work though. I am confused.
_PrivateFunction2();
}
function _PrivateFunction2() {
alert("look! PrivateFunction1");
//this does not work.
alert(this.variable1);
}
这是很正常的事情。唯一奇怪的是它们出现在另一个函数中,但这很好。JavaScript具有,这意味着在一个函数中定义的所有变量都在一个新的作用域中定义。它们不会践踏全局名称空间。函数是JavaScript的,这意味着它们可以像其他数据类型一样使用。它们可以嵌套、传递给函数、从函数返回等
然后我们遇到了一些麻烦:
function _PrivateFunction2() {
alert("look! PrivateFunction1");
//this does not work.
alert(this.variable1);
}
}
JavaScript中的函数总是由this
关键字引用。当您直接调用函数时(例如:functionName()
),该函数执行的上下文是全局窗口
对象。因此,在\u PrivateFunction2
中,这个.variable1
相当于窗口.variable1
,这可能不是您的意思
您可能想引用myobject
的当前实例,这就是此
在\u PrivateFunction2
之外引用的。通过在另一个变量中存储对它的引用,可以在内部作用域中保留对该的访问:
var _this = this;
function _PrivateFunction2() {
alert("look! PrivateFunction1");
//this does not work.
alert(_this.variable1);
}
这里有些微妙的东西你应该注意到<代码>\u PrivateFunction2可以访问its中定义的变量,这就是为什么它可以访问此。这将在以后很重要
下一步:
function _PrivateFunction1() {
//This does work though. I am confused.
_PrivateFunction2();
}
我想,这应该是你觉得最正常的部分。这里没有什么奇怪的事。只有一个常规函数调用另一个函数。不要被嵌套在myObject
中的事实所迷惑。这改变了他们所处的范围,但除此之外没有太大改变
接下来我们定义一些实例变量和方法:
this.variable1 = "tst";
this.function1 = function() {
//Now this function works. A 'this' function to a private function is ok
_PrivateFunction1();
//Here is error one, I cannot seem to call methods within the object
//from.
this.function2();
}
this.function2 = function() {
alert("look! function2!");
}
这里的this
确实指的是myObject
,假设-,这是一个重要的假设-myObject
是用new
操作符调用的,如下所示:
var obj = new myObject();
var obj = myObject();
var obj = new myObject();
obj.function1();
如果是这样称呼的话:
var obj = new myObject();
var obj = myObject();
var obj = new myObject();
obj.function1();
然后这个
将引用窗口
对象,就像我们前面看到的函数一样。关键在于此
的值不是固定的。它由调用函数的方式决定。甚至有明确的方法
this
内this.function1
的值也将是myObject
的当前实例,因为它很可能会这样使用:
var obj = new myObject();
var obj = myObject();
var obj = new myObject();
obj.function1();
写入object.method()
将此设置为对象内部方法
那么,this.function1
如何调用\u PrivateFunction1()
?正如我们之前在保存this
的值以供嵌套函数内部使用时所看到的那样,\u PrivateFunction1()
只是this.function1
的词法范围中定义的另一个对象,因此它可以使用,就像this
之前一样
这些私有变量在myObject
返回后很长一段时间内仍然有效
脚注:由于在实例化对象时没有使用new
,因此将要用作构造函数的函数名大写被认为是一种良好的做法。所以myObject
应该是myObject
如何调用函数?您可以从调用\u PrivateFunction1
调用\u PrivateFunction2
,因为函数位于同一作用域中(两者都在myObject
内)。从这个.function()内调用这个.function2()可能不起作用,因为此时的“this”指的是function2(),而不是myObject()@Michael yeah您必须保存实际对象的副本,如再次注意var=this
。。我的心都碎了。谢谢@qwertymk@Seth,@Michael——一点也不奇怪。调用this.function2
有效,因为this.function1
中this
的值是myObject
。但是\u PrivateFunction2
中的this
的值是全局对象(窗口
)。因此,this.variable1
正在窗口
对象上查找名为variable1
的属性,这不是您想要的。函数的调用方式改变了该函数中所指的内容。请参阅下面我的答案,以获得更详细的解释。感谢您提供更详细的答案。我有计算机科学学位,所以这很有帮助。由于我一直在学习Java/C#,“this”关键字,从对象内部使用的角度来看,真的把我和javascript搞混了。有了这个,我应该更擅长javascript了!谢谢你,伙计