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
), 得到的对象并不是同一个对象, 而是不同的对象.