代码如下 | 复制代码 |
varyx01=new function(){ return"圆心" }; alert(yx01);//[objectobject] |
相当于:
代码如下 | 复制代码 |
function匿名类(){ return"圆心"; } varyx01=new匿名类();alert(yx01); |
下面情况却不一样:
代码如下 | 复制代码 |
varyx01=new function(){ returnnewString("圆心") }; alert(yx01);//圆心 |
说明:只要new表达式之后的constructor返回(return)一个引用对象(数组,对象,函数等),都将覆盖new创建的匿名对象,如果返回(return)一个原始类型(无return时其实为return原始类型undefined),那么就返回new创建的匿名对象。
下面引用一段MDN的解释,看看new操作符到底做了什么:
Whenthecodenewfoo(...)isexecuted,thefollowingthingshappen:
1.Anewobjectiscreated,inheritingfromfoo.prototype.
2.Theconstructorfunctionfooiscalledwiththespecifiedargumentsandthisboundtothenewlycreatedobject.newfooisequivalenttonewfoo(),i.e.ifnoargumentlistisspecified,fooiscalledwithoutarguments.
3.Theobjectreturnedbytheconstructorfunctionbecomestheresultofthewholenewexpression.Iftheconstructorfunctiondoesn’texplicitlyreturnanobject,theobjectcreatedinstep1isusedinstead.(Normallyconstructorsdon’treturnavalue,buttheycanchoosetodosoiftheywanttooverridethenormalobjectcreationprocess.)
补充:function,new function,new function
使用方法一:
代码如下 | 复制代码 |
varfoo01=function()//orfun01=function() { vartemp=100; this.temp=200; returntemp+this.temp; } alert(typeof(foo01)); |
最普通的function使用方式,定一个JavaScript函数。两种写法表现出来的运行效果完全相同,唯一的却别是后一种写法有较高的初始化优先级。在大扩号内的变量作用域中,this指代foo01的所有者,即window对象。
使用方法二:
代码如下 | 复制代码 |
varfoo02=new function() { vartemp=100; this.temp=200; returntemp+this.temp; } alert(typeof(foo02)); |
这是一个比较puzzle的function的使用方式,好像是定一个函数。但是实际上这是定一个JavaScript中的用户自定义对象,不过这里是个匿名类。这个用法和函数本身的使用基本没有任何关系,在大扩号中会构建一个变量作用域,this指代这个作用域本身。
使用方法三:
代码如下 | 复制代码 |
varfoo3=new function('vartemp=100;this.temp=200;returntemp+this.temp;'); alert(typeof(foo3)); |
使用系统内置函数对象来构建一个函数,这和方法一中的第一种方式在效果和初始化优先级上都完全相同,就是函数体以字符串形式给出。
使用方法四:
代码如下 | 复制代码 |
varfoo4=Function('vartemp=100;this.temp=200;returntemp+this.temp;'); alert(typeof(foo4)); |
这个方式是不常使用的,效果和方法三一样,不过不清楚不用new来生成有没有什么副作用,这也体现了JavaScript一个最大的特性:灵活!能省就省。
如果还不明白可参考JS类定义原型方法的两种实现的区别
代码如下 | 复制代码 |
JScriptClass: functionJSClass() { } Extendsprototypemethod: }; Or function=JSClass.prototype.MethodA() }; |