javascript中new function()注意事项

 代码如下 复制代码

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));
alert(foo01());
运行结果:
function
300

最普通的function使用方式,定一个JavaScript函数。两种写法表现出来的运行效果完全相同,唯一的却别是后一种写法有较高的初始化优先级。在大扩号内的变量作用域中,this指代foo01的所有者,即window对象。

使用方法二:

 代码如下 复制代码

varfoo02=new function()
{
vartemp=100;
this.temp=200;
returntemp+this.temp;
}

alert(typeof(foo02));
alert(foo02.constructor());
运行结果:
object
300

这是一个比较puzzle的function的使用方式,好像是定一个函数。但是实际上这是定一个JavaScript中的用户自定义对象,不过这里是个匿名类。这个用法和函数本身的使用基本没有任何关系,在大扩号中会构建一个变量作用域,this指代这个作用域本身。

使用方法三:

 代码如下 复制代码

varfoo3=new function('vartemp=100;this.temp=200;returntemp+this.temp;');

alert(typeof(foo3));
alert(foo3());
运行结果:
function
300

使用系统内置函数对象来构建一个函数,这和方法一中的第一种方式在效果和初始化优先级上都完全相同,就是函数体以字符串形式给出。

使用方法四:

 代码如下 复制代码

varfoo4=Function('vartemp=100;this.temp=200;returntemp+this.temp;');

alert(typeof(foo4));
alert(foo4());
运行结果:
function
300

这个方式是不常使用的,效果和方法三一样,不过不清楚不用new来生成有没有什么副作用,这也体现了JavaScript一个最大的特性:灵活!能省就省。

如果还不明白可参考JS类定义原型方法的两种实现的区别

 

 代码如下 复制代码

JScriptClass:
functionJSClass()
{

}

Extendsprototypemethod:
JSClass.prototype.MethodA=function()
{

};

Or

function=JSClass.prototype.MethodA()
{

 };

时间: 2024-09-20 18:48:51

javascript中new function()注意事项的相关文章

javascript中的Function.prototye.bind

  这篇文章主要介绍了javascript中的Function.prototye.bind的相关资料,需要的朋友可以参考下 函数绑定(Function binding)很有可能是你在开始使用JavaScript时最少关注的一点,但是当你意识到你需要一个解决方案来解决如何在另一个函数中保持this上下文的时候,你真正需要的其实就是 Function.prototype.bind(),只是你有可能仍然没有意识到这点. 第一次遇到这个问题的时候,你可能倾向于将this设置到一个变量上,这样你可以在改变

深入浅析JavaScript中的Function类型_javascript技巧

Function是javascript里最常用的一个概念,javascript里的function是最容易入手的一个功能,但它也是javascript最难理解最难掌握的一个概念. 1. Function类型是js中引用类型之一,每个函数实际上都是Function类型的实例对象,具有自己的属性和方法.正因为函数式对象,所以函数名实际上也是一个指向函数对象的指针. 2. 常用的函数定义方式 1. 函数声明: function sum(a , b ){ return a+b; } 2. 表达式: va

浅谈javascript中的Function和Arguments_javascript技巧

javascript的Function 属性: 1.Arguments对象 2.caller  对调用单前函数的Function的引用,如果是顶层代码调用,  则返回null(firefox返回undefined).  注:只有在代码执行时才有意义 3.length  声明函数是指定的命名参数的个数(函数定义是,定义参数的个数) 4.prototype  一个对象,用于构造函数,这个对象定义的属性和方法  由构造函数创建的所有对象共享. 方法:  applay() --> applay(this

JavaScript中的function使用方法

JavaScript入门易,可深究起来,竟搞得我如此混乱,这恐怕就是弱类型语言的特点吧?写惯了C++,还真是不适应.近日在google上搜来搜去,学习了半天function.this和prototype,这就总结一下,但愿能把它们理清楚.这是第一篇,关于JavaScript中的function. 参考了一些文章,我认为JavaScript中的function可以有以下两种用法:一是做"普通逻辑代码容器",也就是我们通常意义上的函数.方法,和我们C/C++里的函数没什么大分别,只是写法稍

JavaScript中removeEventListener()使用注意事项

最近复习JavaScript中的基础知识,一方面给新来的实习生介绍一下JavaScript基础知识,一方面也是自己工作一年来自己在JavaScript方面学习的总结.   Javascript在Web开发中地位越来越重要,所以也很多人说,JavaScript在Web开发中地位就像C语言在操作系统上的地位.目前稍微复杂的Web应用或者企业拥有,都会使用到JavaScript.   addEventListener(eventtarget,eventlistener,event caputring)

浅谈Javascript中的Function与Object_javascript技巧

Function 函数就是对象,代表函数的对象就是函数对象.所有的函数对象是被Function这个函数对象构造出来的.也就是说,Function是最顶层的构造器.它构造了系统中所有的对象,包括用户自定义对象,系统内置对象,甚至包括它自已. Object Object是最顶层的对象,所有的对象都将继承Object的原型,你也要知道Object也是一个函数对象,所以说Object是被Function构造出来的. Function 与Object 关系图: 复制代码 代码如下: <script typ

JavaScript中的Function函数_javascript技巧

首先给大家介绍JavaScript中function定义函数的几种方法: 1.最基本的作为一个本本分分的函数声明使用. 复制代码 代码如下: function func(){} 或 复制代码 代码如下: var func=function(){}; 2.作为一个类构造器使用: function class(){} class.prototype={}; var item=new class(); 3.作为闭包使用: (function(){ //独立作用域 })(); 4.可以作为选择器使用:

javascript中的Function.prototye.bind_javascript技巧

函数绑定(Function binding)很有可能是你在开始使用JavaScript时最少关注的一点,但是当你意识到你需要一个解决方案来解决如何在另一个函数中保持this上下文的时候,你真正需要的其实就是 Function.prototype.bind(),只是你有可能仍然没有意识到这点. 第一次遇到这个问题的时候,你可能倾向于将this设置到一个变量上,这样你可以在改变了上下文之后继续引用到它.很多人选择使用 self, _this 或者 context 作为变量名称(也有人使用 that)

javascript中函数(function)的用法

函数作为变量 var myFun; if( Math.random > 0.5){     myFun = function(){           alert("hellow");     }        }else{     myFun = function(){                  alert("world");         }     } myFun(); 函数作为参数 function doSomething(callbackd