Javascript 通过函数实例访问JS函数变量

Javascript 通过函数实例访问JS函数变量,javascript,function,variables,closures,this,Javascript,Function,Variables,Closures,This,我只是想用不同的方式理解函数中定义的变量的行为。所以我只是尝试了一些代码,并在下面的评论中得出结论。如果我理解错了,请告诉我。如果我遗漏了什么,也可以加上 我想知道如何通过函数实例(objTempFun1和objTempFun2)访问函数中声明的变量,比如functionName.variableName),就像我可以在函数内部定义方法,通过函数实例公开闭包变量一样 function tempFun() { this.val1 = "this.var1"; var val2 =

我只是想用不同的方式理解函数中定义的变量的行为。所以我只是尝试了一些代码,并在下面的评论中得出结论。如果我理解错了,请告诉我。如果我遗漏了什么,也可以加上

我想知道如何通过函数实例(
objTempFun1
objTempFun2
)访问函数中声明的变量,比如
functionName.variableName
),就像我可以在函数内部定义方法,通过函数实例公开闭包变量一样

function tempFun() {
    this.val1 = "this.var1";
    var val2 = "var var2"; //locally scoped var, not added to function instance nor to the prototype

    this.getLocalVar = function () {
        return val2;
    };

    this.setLocalVar = function (arg) {
        val2 = arg;
    };
}

tempFun.prototype.val3 = "fun.proto.var3";
tempFun.val4 = "fun.var4";

var objTempFun1 = new tempFun();
var objTempFun2 = new tempFun();

/*-----------------------------------------------------------------------
        Variables defined as `this.variableName`
        1. Are declared on prototype
        2. Have separate values across instances
        3. Cannot be accessed on function itself
        -----------------------------------------------------------------------*/
document.write("<br />obj1-this.var1:   " + objTempFun1.val1 + "<br />");
document.write("obj2-this.var1:   " + objTempFun2.val1 + "<br />");
document.write("fun-this.var1:   " + tempFun.val1 + "<br />");

objTempFun1.val1 = "this.var1x";
objTempFun2.val1 = "this.var1y";
document.write("obj1-this.var1:   " + objTempFun1.val1 + "<br />");
document.write("obj2-this.var1:   " + objTempFun2.val1 + "<br />");

/*-----------------------------------------------------------------------
        Variables defined inside function as `var variableName`
        1. Are closure-scoped; defined neither on function nor on prototype
        2. Have separate values across function instances
        3. Can only be accessed through function instance by adding methods on 
           a prototype (as above getLocalVar and setLocalVar methods)
        -----------------------------------------------------------------------*/
document.write("obj1-var var2:   " + objTempFun1.val2 + "<br />");
document.write("obj2-var var2:   " + objTempFun2.val2 + "<br />");
document.write("fun-var var2:   " + tempFun.val2 + "<br />");
document.write("obj1-printLocalVar:   " + objTempFun1.getLocalVar() + "<br />");
document.write("obj2-printLocalVar:   " + objTempFun2.getLocalVar() + "<br />");
objTempFun1.setLocalVar("var var2x");
objTempFun2.setLocalVar("var var2y");
document.write("obj1-printLocalVar:   " + objTempFun1.getLocalVar() + "<br />");
document.write("obj2-printLocalVar:   " + objTempFun2.getLocalVar() + "<br />");

/*-----------------------------------------------------------------------
        Variables defined as `functionName.prototype.variablename`
        1. Are declared on prototype
        2. Have separate values across function instances
        3. Cannot be accessed on function itself
        -----------------------------------------------------------------------*/
document.write("obj1-this.proto.var3:   " + objTempFun1.val3 + "<br />");
document.write("obj2-this.proto.var3:   " + objTempFun2.val3 + "<br />");
document.write("fun-this.proto.var3:   " + tempFun.val3 + "<br />");
objTempFun1.val3 = "fun.proto.var3x";
objTempFun2.val3 = "fun.proto.var3y";
document.write("obj1-this.proto.var3:   " + objTempFun1.val3 + "<br />");
document.write("obj2-this.proto.var3:   " + objTempFun2.val3 + "<br />");

/*------------------------------------------------------------------------
        Variables defined as `functionName.variablename`
        1. Become member of function (or say 'F'unction instance, which is tempFun) 
           not the function instances (which are objTempFun1 & objTempFun2 above)
        2. Cannot be accessed on function instances
        ------------------------------------------------------------------------*/
document.write("obj1-fun.var4:   " + objTempFun1.val4 + "<br />");
document.write("obj2-fun.var4:   " + objTempFun2.val4 + "<br />");
document.write("fun-fun.var4:   " + tempFun.val4 + "<br />");
函数tempFun(){
this.val1=“this.var1”;
var val2=“var var2”;//局部范围的变量,未添加到函数实例或原型中
this.getLocalVar=函数(){
返回值2;
};
this.setLocalVar=函数(arg){
val2=arg;
};
}
tempFun.prototype.val3=“fun.proto.var3”;
tempFun.val4=“fun.var4”;
var objTempFun1=new tempFun();
var objTempFun2=新的tempFun();
/*-----------------------------------------------------------------------
定义为'this.variableName'的变量`
1.在原型上声明
2.在实例之间有单独的值
3.无法对函数本身进行访问
-----------------------------------------------------------------------*/
文件。写(“
obj1-this.var1:“+objTempFun1.val1+”
); 文件。写入(“obj2-this.var1:+objTempFun2.val1+”
); 文件。写入(“fun-this.var1:+tempFun.val1+”
); objTempFun1.val1=“this.var1x”; objTempFun2.val1=“this.var1y”; 文件。写入(“obj1-this.var1:+objTempFun1.val1+”
); 文件。写入(“obj2-this.var1:+objTempFun2.val1+”
); /*----------------------------------------------------------------------- 函数中定义为`var variableName'的变量` 1.是否有封闭范围;既不在函数上也不在原型上定义 2.在函数实例之间有单独的值 3.只能通过在上添加方法通过函数实例访问 原型(如上getLocalVar和setLocalVar方法) -----------------------------------------------------------------------*/ 文件。写入(“obj1 var var2:+objTempFun1.val2+”
); 编写(“obj2 var var2:+objTempFun2.val2+”
); 文件。写入(“fun var var2:+tempFun.val2+”
); document.write(“obj1 printLocalVar:+objTempFun1.getLocalVar()+”
); 编写(“obj2 printLocalVar:+objTempFun2.getLocalVar()+”
); objTempFun1.setLocalVar(“var var2x”); objTempFun2.setLocalVar(“VarVar2y”); document.write(“obj1 printLocalVar:+objTempFun1.getLocalVar()+”
); 编写(“obj2 printLocalVar:+objTempFun2.getLocalVar()+”
); /*----------------------------------------------------------------------- 变量定义为`functionName.prototype.variablename` 1.在原型上声明 2.在函数实例之间有单独的值 3.无法对函数本身进行访问 -----------------------------------------------------------------------*/ 文件。写入(“obj1-this.proto.var3:+objTempFun1.val3+”
); 编写(“obj2-this.proto.var3:+objTempFun2.val3+”
); 文件。编写(“fun-this.proto.var3:+tempFun.val3+”
); objTempFun1.val3=“fun.proto.var3x”; objTempFun2.val3=“fun.proto.var3y”; 文件。写入(“obj1-this.proto.var3:+objTempFun1.val3+”
); 编写(“obj2-this.proto.var3:+objTempFun2.val3+”
); /*------------------------------------------------------------------------ 定义为`functionName.variablename'的变量` 1.成为函数的成员(或者说“F”函数实例,这是tempFun) 不是函数实例(上面的objTempFun1和objTempFun2) 2.无法在函数实例上访问 ------------------------------------------------------------------------*/ 文件。写入(“obj1-fun.var4:+objTempFun1.val4+”
); 文件。编写(“obj2-fun.var4:+objTempFun2.val4+”
); 文件。写入(“fun-fun.var4:+tempFun.val4+”
);

查找JSFIDLE。

提供对构造对象的函数的访问。

定义为
this.variableName
1.的变量在原型上声明”-不,它们在实例上声明,但可以通过原型方法访问。如果它们是在原型上声明的,那么它们就不会“2.在实例之间有单独的值”。第一个也是可以说是最重要的规则是:(a)函数内部声明的变量,如
val2
,是“私有的”,只能通过函数的特权方法从外部读取/写入;(b)对于要授予特权的方法,它必须是在外部函数中定义的函数,或者返回、作为事件处理程序附加,或者以
this.foo=function(){…}
的形式定义(其中外部函数必须作为关键字为“new”的构造函数调用)。外部定义的方法总是“公共”的,但不是“特权的”。@nnnnnn“但是可以从原型方法访问”,例如?我在protorype
val3
上声明的变量在
objTempFun1
objTempFun2
之间有单独的值