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了!谢谢你,伙计