首页 新闻 会员 周边

js 引用类型

1
悬赏园豆:10 [已解决问题] 解决于 2012-05-14 13:27
//====================
var a=function(){}
a.add=function a(){
    return 1;
}
var b=a;
a.add=function b(){
     return 2;
}
b.add();//log: 2

//====================
var c=function(){
    return 1;
}

var d=c;

c=function(){
     return 2;
}
d(); // log:1


都是引用类型,这两段代码有啥区别吗,请教
axle的主页 axle | 初学一级 | 园豆:185
提问于:2012-05-08 17:54
< >
分享
最佳答案
0
            //函数表达式,空构造函数
            var a = function () { }
            alert(typeof a) //function
            a.add = function a() {
                alert("1");
            }
            a.add();//1
            var b = a; //函数表达式,b引用a,b的protptype指向var a = function(){}
            alert(typeof b); //function
   //新的a.add = function b(){}会把原来var a = function(){}中的方法给重写了。
a.add = function b() { alert("2"); } window.onload = function () { b.add(); //2 }

收获园豆:10
icepy | 小虾三级 |园豆:587 | 2012-05-09 21:20
            //c构造函数
            var c = function () {
                alert("1");
            }
            //var d = c;
            //新的C
            c = function () {
                alert("2");
            }
            var d = c;
            window.onload = function () {
                d(); // 1
            }

javascript的执行环境与别的语言有些区别,它是从上向下开始执行,如果你的var d= c;放在下面,那么它就会弹出2来了。而每一个新的数据流都会在内存中占据一个位置,如果你要释放它,设置为null就可以了。
icepy | 园豆:587 (小虾三级) | 2012-05-09 21:27
var b = a; //函数表达式,b引用a,b的protptype指向var a = function(){}
b的protptype指向var a = function(){}有点不明白。

那var b=a 和 var b=new a() 有啥区别呢?

axle | 园豆:185 (初学一级) | 2012-05-10 15:18

@axle: 

在JavaScript中,是通过prototype原型链的方式来实现指针的指引,你可以把它想象成指引,b与a都链向一个内存位置。

var b = a;是相当于 b引用了a ,而var b = new a()是new了一个实例。要说区别把,这两种方式都能得到a 定义的方法,唯一有区别的地方,后面这个new出了实例。

icepy | 园豆:587 (小虾三级) | 2012-05-10 15:58
其他回答(1)
1

第一段:a存放的是指向对象数据的地址 是个address 然后赋予b, b和a存放的是一样的一个地址。

a.add=function b(){     return 1;} 这句话的意思是通过a存放的地址找到数据对象 然后在数据对象里存放一个add方法,
a.add=function b(){     return 2;} 这句话的意思是通过a存放的地址找到数据对象 然后在数据对象里修改add方法,
既然b和a存放的是同个地址 地址指向的数据对象已经被修改 那么b.add() 就是2了。
第二段:c存放的是指向对象数据的地址, d和c存放的是一样的一个地址。
不同的是,c=function(){ return 2;} 里面function(){ return 2;}是一个新的对象数据,那么在堆上就会有新的内存空间来放,会产生新的地址赋予c,既然c和d本来的关系是 存放这一样的地址 现在c改变了地址,跟d又没关系 所以d()还是指向原来的地址就是还是1
 我这是透过现象看本质。。。 哈哈  你参考参考就行了 我也不确定到底是不是完全准确 
koi | 园豆:4 (初学一级) | 2012-05-08 20:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册