代码如下:var myObj=function(){
var accessNumber;
this.setAccessNumber = function(value) {
    accessNumber = value;
};
this.getAccessNumber = function() {
    return accessNumber ;
};
};
var cc =new myObj();
cc.setAccessNumber(8888888);
var dd=new myObj();
for(p in cc){
dd[p]=cc[p];
}
dd.setAccessNumber(23123123);
console.error(cc.getAccessNumber());//23123123我创建一个js 对象 myObj
然后创建两个实例,对其中一个赋值,另一个拷贝值为什么我对其中一个赋值,另一个也跟着变呢?好奇怪,function 里面还藏着引用,也被拷贝过去啦?

解决方案 »

  1.   


    var myObj = function() {
        this.accessNumber = null;
        this.setAccessNumber = function(value) {
            this.accessNumber = value;
        };
        this.getAccessNumber = function() {
            return this.accessNumber ;
        };
    };这样子就不一样了.
    --------------------这里并不是楼主所说的引用了复制
    alert(cc == dd); 就可以发现 cc 和 dd 并没有引用同一对象.为什么会这样子呢, 这里就是闭包的问题了.
    得注意的是,按你这么的写法 
    accessNumber 并不会成为新构造出来对象的属性
    而是 函数 myObj() 里的局部变量.new myObj() 的时候,新构造出来的对象有两个方法引用了 accessNumber
    每构造一个对象的时候 就会形成一个闭包
    构造了两个对象 cc, dd; 就有两个闭包产生了本来各个对象的 setAccessNumber, getAccessNumber 都引用不同闭包中的 accessNumber,也没什么问题但,把 cc 的属性复制给 dd 时。 当然函数也复制过去了。函数复制过去后dd.setAccessNumber 和 dd.getAccessNumber 
    就和 cc.setAccessNumber 和 cc.getAccessNumber
    一样引用着同一个 accessNumber 变量了
    以至于后面
    dd.setAccessNumber(23123123);

    cc.getAccessNumber() == 23123123
      

  2.   

    嗯...闭包变量也给复制了...你在这里alert一下就能看到.for(p in cc){
        dd[p]=cc[p];
        alert(p)
    }