当函数返回对象的时候, new func() 与 func() 效果是一样的么?

2014-07-03 12:19:37 +08:00
 mopig
4507 次点击
所在节点    JavaScript
19 条回复
andyhu
2014-07-03 12:23:48 +08:00
效果不一样,建议楼主学下javascript基础
js里的类其实也是一个函数,用new的话就是相当于“类”的概念了,返回的是一个对象。直接运行函数只是返回函数里的返回值
housne
2014-07-03 12:35:55 +08:00
- - 貌似是一样的,但为什么这里要 new 呢 。。。
chraac
2014-07-03 12:48:04 +08:00
this不一样了吧
jsonline
2014-07-03 12:58:41 +08:00
当然不一样。
任何一本JS书里都写了 new 操作符做了什么事情。
bigcoon
2014-07-03 13:09:50 +08:00
应用层面来说无本质区别,calculator 和 Calculator() 返回的对象是一样的
lijsh
2014-07-03 13:13:06 +08:00
首先,用new调用与不使用new调用的区别在于,前者会隐式返回一个实例,函数体内的this指向这个实例;

但如果函数显式返回一个对象,那么new func()里面this的操作虽然还是针对实例对象,但返回的时候这个实例对象会被丢弃,new func()和func()的效果就是一样的。

注意这里返回的必须是对象,如果return的是字符串或者Number,那就不会有效果,构造函数原来的行为会得到保留。

参考: http://bonsaiden.github.io/JavaScript-Garden/zh/#function.constructors
zewenzhang
2014-07-03 13:17:04 +08:00
完全一样
lijsh
2014-07-03 13:28:53 +08:00
举个例子
var a = function(name) {
this.name = name;
console.log(this.name);
return {
sayName: function() {
console.log(this.name);
}
}
}

var A = new a("Jason") //this指向实例,输出"Jason";返回一个包含sayName方法的对象

A.sayName(); //this指向全局,输出"undefined"
lijsh
2014-07-03 13:29:48 +08:00
缩进居然不支持……擦
chemzqm
2014-07-03 13:43:01 +08:00
除非你是构造函数实例化一个对象,否则别用 new.
如果你想让调用者可以省略new 关键字,可以这么搞:

function Notice(msg, options) {
if (! (this instanceof Notice)) return new Notice(msg, options);

这样有没有 new 调用 Notice 就完全一样了
otakustay
2014-07-03 13:50:27 +08:00
函数内部的this会不一样,抛开逻辑光从返回值上来说new和没有new是一样的了,比如

function xx() {
return { x: 1 };
}

这样xx()和new xx()是完全一样的
bravluna
2014-07-03 14:37:46 +08:00
答案:一样的。可是这样写很容易引起困扰,因为它依赖一个硬性规定,就是如果构造函数返回了一个对象,那么这个对象会替代 new 操作符产生的对象而成为 new 对象创建表达式的值。所以,如果想把一个函数当成构造函数,就不要包含 return 语句。
coolicer
2014-07-03 15:13:46 +08:00
上面已经有人回答了,不一样。new过之后,this指向明显不一样。
chshouyu
2014-07-03 16:08:11 +08:00
@lijsh 答案
lijsh
2014-07-03 16:46:08 +08:00
@chshouyu 啥?
lotem
2014-07-03 17:54:59 +08:00
@lijsh 8樓的程序裏 A.sayName() 輸出 undefined 只是因爲a()返回對象的name屬性沒有值吧,this指向對象A。
lotem
2014-07-03 18:03:35 +08:00
> var a = function(name) {
... this.name = name;
... console.log(this.name);
... return {
..... name: "Tuzki",
..... sayName: function() {
....... console.log(this.name);
..... }
... }
. }
undefined
> var A = new a("Jason")
Jason
undefined
> A.sayName();
Tuzki
undefined
>
不影響結論,那個 name=="Jason" 的對象被丟棄了。
lijsh
2014-07-03 19:25:59 +08:00
@lotem 就是这样
xieranmaya
2014-07-05 11:27:03 +08:00
这是基础啊大哥
有new时this指向新创建的对象
没new时this指向global
非要处理这种情况的话,一般的做法是
function Class(){
if(this==window){// !this instanceof Class
return new Class();
}else{
init();
}
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/120761

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX