任何一个函数都可以被当做构造函数使用!并且new了之后一定是返回一个对象,这个对象有两种可能,第一种,return中返回的不是一个对象(包括数组,因为它也是一个对象,不包括函数,因为函数也是一种对象)(不是一个对象指返回一个变量值之类的)或者没有返回(实际上返回undefined 也不是一个对象),那么这样的话返回的就是未被初始化的this对象,return后面的返回值被自动忽略。第二种,若返回一个对象a的话则new处理的this被屏蔽掉并且返回该对象a 。这些跟构造函数里面有无this无关,有this只是对this对象进行初始化,当然返不返回只看return后面的值。
依据第一条可以实现代码的重构(有两个功能)该函数作为构造函数使用时,它提供返回对象功能,当作一般函数使用时返回一般值。
再举个列子
[img]http://dl2.iteye.com/upload/attachment/0109/3074/1ad29a91-ef76-3150-9c15-3bc8d232e9e0.png[/img]
new了两次之后,指向如图,可以验证,将l指向一个新的对象,则a b指向不变,说明并不依赖于l这个全局变量,使a==b 返回true 验证如下
[img]http://dl2.iteye.com/upload/attachment/0109/3077/53dd5cd0-fcf9-325a-8f74-c4438c74e51e.png[/img]
var g=new function(){return {name:'fff'}}
-->g input {name:'fff'};
function f(){this.name='fff';var name='ol';return name;}
var b=new f();
返回this对象
依据第一条可以实现代码的重构(有两个功能)该函数作为构造函数使用时,它提供返回对象功能,当作一般函数使用时返回一般值。
function f(){this.name='bob';this.age='30';
return 'fff'
}
var a=new f();
a ->{name:'bob',age:30};
var b=f();
b ->'fff';
注意,a与b返回值不一致。
function g(){this.name='bob';this.age='30';
return function(){}
}
var c=new g();
c ->function(){}
再举个列子
[img]http://dl2.iteye.com/upload/attachment/0109/3074/1ad29a91-ef76-3150-9c15-3bc8d232e9e0.png[/img]
function f(){if(typeof l=='undefined')
l=this;//this是new的对象,此时将它的值赋给刚创建的全局变量l(可以理解成c语言当中的将该对象的地址赋给它,如图)
return l;}
new了两次之后,指向如图,可以验证,将l指向一个新的对象,则a b指向不变,说明并不依赖于l这个全局变量,使a==b 返回true 验证如下
[img]http://dl2.iteye.com/upload/attachment/0109/3077/53dd5cd0-fcf9-325a-8f74-c4438c74e51e.png[/img]