为了账号安全,请及时绑定邮箱和手机立即绑定

创建的全局同名对象的问题

创建的全局同名对象的问题

HUWWW 2019-02-27 09:15:40
function createPerson(name) {    obj = new Object();    obj.name = name;    obj.showName = function() {        alert(this.name);    };}createPerson("小明");console.log(obj);var a = obj;//此次a被复制的obj可以理解,应为是第一次出现新的对象obj.showName();createPerson("小强");console.log(obj);obj.showName();var b = obj;//此处b被复制obj的时候为什么obj就是指createPerson('小强')运行后生成的obj了?对象是不会被覆盖的,两个obj对象被保持在内存中。为什么b不是被赋值第一次createPerson('小明')时的obj呢?console.log(a);//Object {name: "小明"}console.log(b);//Object {name: "小强"}问题:在code中文字表示b被复制obj的时候为什么obj就是指createPerson('小强')运行后生成的obj了?对象是不会被覆盖的,两个obj对象被保持在内存中。为什么b不是被赋值第一次createPerson('小明')时的obj呢?
查看完整描述

2 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

只有在通过 new 调用构造函数的时候才会产生新对象,其它赋值操作都是对同一个对象的引用进行赋值(或拷贝),也就是说,对象只有一个,但是会有很多引用(可以当作名称),

  • obj = new Object() 这里产生了一个对象,同时产生了它的引用,由全局变量 obj 保存(引用)

  • a = obj,是把 obj 这个引用赋值给 a,现在 obj 和 a 都指向同一个欢象

  • 再次调用 createPerson() 的时候,obj = new Object() 产生了新的对象,并将新对象的引用赋值给 obj,这个时候 a 仍然引用旧的对象,只是 obj 在引用新对象。

  • b = obj,让 b 与现在的 obj 引用相同,即都引用新对象

  • 最后的状况就是,a 引用第一个对象,b 和 obj 引用第二个对象

最后扩展说明一点,如果整个程序中没有任何一个变量引用某个对象的时候,这个对象会被垃圾回收器回收,但回收时间并不确定。


查看完整回答
反对 回复 2019-03-04
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

执行createPerson('小明'),创建了一个新对象,并且obj这个全局变量是指向这个对象的一个指针。

然后,声明变量a,a把全局变量obj这个指针复制了一份。(此时obj变量指向小明这个对象)

执行createPerson('小强'),创建了一个新对象,并且之前的obj全局变量指向了这一个新的对象,之前的那个对象
还存在,只是obj不指向它了。(此时obj变量指向小强这个对象)

此时,再声明变量b,将此时的obj指针复制一份给变量b。b自然就指向小强这个对象啦。


查看完整回答
反对 回复 2019-03-04
  • 2 回答
  • 0 关注
  • 464 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信