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“但是可以从原型方法访问”,例如?我在protorypeval3
上声明的变量在objTempFun1
和objTempFun2
之间有单独的值