javascript - js 面向对象问题:为什么用不用new都一样呢?
本文介绍了javascript - js 面向对象问题:为什么用不用new都一样呢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
s= {
"a":111
}
ss = {
"sss" : {
"set":function(num){
this.a=num
return this
},
"a":222
}
}
Object.setPrototypeOf(ss.sss, s);
alert(new ss.sss.set(333).a+'--'+new ss.sss.set(555).a);
alert(ss.sss.set(333).a+'--'+ss.sss.set(555).a);
1.两个alert的执行结果为什么是一样的呢?
2.为什么new 和没new 一样呢?
3.没new是一个独立的对象吗?
4.如果效果一样,没用new是不是更省内存呢?
答案公布,因为函数里有return返回对象了,所以不需要new,如果写new 就不必返回对象,重复了!还有没new的和new的一样,没有哪个更省内存,因为new包括了return 对象就真么简单,感谢问题下面的评论者的链接
解决方案
new ss.sss.set(333).a
和new ss.sss.set(555).a
这两个操作, 得到的this
不是ss
对象, 而是set
的实例. 这里的this.__proto__ === ss.sss.set.prototype
. 这里的this.a
与ss.sss
无关, 是新实例的this.a
. 返回新实例, 访问其a
属性, 就会得到刚才设置的a
属性.ss.sss.set(333).a
和ss.sss.set(555).a
这两个操作, 因为没有使用new
, 所以这里的this
指向的是ss.sss
, 所以修改的是ss.sss.a
. 因为ss.sss.set
返回的是this
, 所以这里的ss.sss.set(333).a
实际上就是ss.sss.a
.
综上, 实际上你两种方式(用或不用new
), 得到的对象并不是同一个对象, 而是不同的对象.
这篇关于javascript - js 面向对象问题:为什么用不用new都一样呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文