2 tiangej tiangej 于 2017.09.08 18:34 提问

疑惑: 在原型方法中访问var变量
 如下代码:
期待结果:  输出 1,2
实际结果:  输出 2,2

<script>

    function A(par)
    {
        var i = par ;
        A.prototype.getI = function ()
        {
            return i ;
        }

    }

    function B()
    {
        var a1 = new A(1);
        var a2 = new A(2);

        console.log(a1.getI());
        console.log(a2.getI());
    }

    B() ;

</script>





如下两种措施能够达到目的
1.  将  【var i = par ;】      改为   【this.i = par ;】
2.  将  【A.prototype.getI = function ()】      改为   【this.getI = function ()】

》疑惑
本问题的本质是js作用域(上下文空间)。
请朋友们指点迷津

3个回答

showbo
showbo   Ds   Rxr 2017.09.08 22:27
已采纳

prototype放构造函数外,要不没次构造都会更新prototype中getI函数执行最后一次构造的传入的参数了

要么就不要prototype,直接this.getI=...生成新方法


    function A(par) {
        var i = par;
        this.getI = function () {
            return i;
        }

    }
    //或者===>
    function A(par) { this.i = par }
    A.prototype.getI = function () { return this.i}
tiangej
tiangej 理解了
13 天之前 回复
tiangej
tiangej 能否请你详细阐述一下你的观点,可能地话,给出一些可靠的官方资料?
14 天之前 回复
tiangej
tiangej 回复showbo: 如果不是引用,那么这种解释就行不通了。‘实例化多个对象,最后实例化对象的i被其他对象所共用’这个结果并不是闭包这个概念能够达到的。我在书籍和网络上查不到相关说明。当然i是引用这个也没有查到。
14 天之前 回复
showbo
showbo 回复tiangej: 是的,不是引用,应该是说闭包好点。i是普通变量,所以不应该说引用。闭包
14 天之前 回复
tiangej
tiangej 回复showbo: 大概理解你的意思了,你看是不是这样: 原型函数getI中的变量i是个引用,指向最后一个实例中的变量i的地址。因此实例化a2的时候,原型函数getI 中的变量i指向a2中的i,也就是值为2的变量地址。因此a1执行原型函数(所有实例共用)getI的时候,实际上取到的是a2中的变量i,而不是自己的i
14 天之前 回复
tiangej
tiangej 回复tiangej: 大概理解你的意思了,你看是不是这样: 原型函数getI中的变量i是个引用,指向最后一个实例中的变量i的地址。因此实例化a2的时候,原型函数getI 中的变量i指向a2中的i,也就是值为2的变量地址。因此a1执行原型函数(所有实例共用)getI的时候,实际上取到的是a2中的变量i,而不是自己的i2
14 天之前 回复
tiangej
tiangej 回复showbo: prototype是所有实例共享的。这没错。但是在本例中,局部变量i是实例变量,而非原型变量。在不同的实例中,i的值理应不同。代码执行结果不能理解。请问你的判断是怎样的?
14 天之前 回复
showbo
showbo 回复tiangej: prototype是所有实例共享的,所以你更新过会影响到所有的实例对象
14 天之前 回复
showbo
showbo 回复tiangej: 不是执行,是指向。。输入的时候没注意。
14 天之前 回复
tiangej
tiangej 重来: 1. 将prototype放构造函数外,这是对的。要不每次执行构造器,Prototype都会被重新定义。 2.【要不没次构造都会更新prototype中getI函数执行最后一次构造的传入的参数了】这句话可能不正确。我的理解是‘重定义’而不是’执行’。况且我的例子中原型函数并没有修改i的值。
14 天之前 回复
tiangej
tiangej 1. 将prototype放构造函数外,这是对的。要不每次执行构造器,Prototype都会被重新定义。要不没次构造都会更新prototype中getI函数执行最后一次构造的传入的参数了
14 天之前 回复
devmiao
devmiao   Ds   Rxr 2017.09.08 21:06
tiangej
tiangej   2017.09.09 17:04

谢谢楼上2位的回答。
我想知道原因,请朋友们针对问题作出解释

Csdn user default icon
上传中...
上传图片
插入图片