【问题标题】:Accessing JS function variables through function instance通过函数实例访问 JS 函数变量
【发布时间】:2013-06-21 20:36:31
【问题描述】:

我只是试图以不同的方式理解函数中定义的变量的行为。所以我只是尝试了一些代码,并在下面得出了放入 cmets 的结论。请告诉我是否理解有误。或者如果我错过了什么就添加。

我想知道如何通过函数实例(objTempFun1objTempFun2)访问在函数(如 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 />");

找到 JSFiddle here

【问题讨论】:

  • “变量定义为this.variableName 1. 在原型上声明” - 不,它们是在实例上声明的,但可以通过原型方法访问。如果它们是在原型上声明的,那么它们将不会“2. 跨实例具有单独的值。”
  • 第一个并且可以说是最重要的规则是 (a) 像 val2 这样在函数内部声明的变量是“私有的”并且只能通过函数的特权方法从外部读取/写入,并且(b) 要获得特权的方法,它必须是定义在外部函数内部的函数,并且要么返回,作为事件处理程序附加,要么以this.foo = function(){...} 的形式定义(其中,外部函数必须作为带有关键字“new”的构造函数)。外部定义的方法始终是“公共的”,但不是“特权的”。
  • @nnnnnn “但可以通过原型方法访问”,例如?我在 protorype val3 上声明的变量在 objTempFun1objTempFun2 之间有不同的值

标签: javascript function variables closures this


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多