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
引用第二个对象
最后扩展说明一点,如果整个程序中没有任何一个变量引用某个对象的时候,这个对象会被垃圾回收器回收,但回收时间并不确定。
潇潇雨雨
TA贡献1833条经验 获得超4个赞
执行createPerson('小明'),创建了一个新对象,并且obj这个全局变量是指向这个对象的一个指针。
然后,声明变量a,a把全局变量obj这个指针复制了一份。(此时obj变量指向小明这个对象)
执行createPerson('小强'),创建了一个新对象,并且之前的obj全局变量指向了这一个新的对象,之前的那个对象
还存在,只是obj不指向它了。(此时obj变量指向小强这个对象)
此时,再声明变量b,将此时的obj指针复制一份给变量b。b自然就指向小强这个对象啦。
添加回答
举报
0/150
提交
取消