JS构造函数详解

前几天学习了JS的闭包,当时为了更好地理解闭包也是专门深入学习了JS的构造函数的一些相关知识。

从形式上看,一个函数被作为构造函数还是普通函数执行的唯一区别,是否用new运算符。

通常来说,构造函数没有返回值,它们只是初始化this指针传递进来的对象,并且什么也不返回。如果一个函数有返回值,被返回的对象就成了new表达式的值。

如果一个函数的返回值是引用类型(数组,对象或者函数)的数据,那么这个函数作为构造函数用new运算符执行构造时,运算的结果将被它的返回值取代,这时候,构造函数体内的this值丢失了,取而代之的是被返回的对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function foo(){ 
this.a=1;
return function(){
return 2;
}
}
var m = new foo();
alert(m); //function(){return 2}
alert(m()); //2
alert(m.a); //undefined

var n = foo();
alert(n); //function(){return 2}
alert(n()); //2
alert(n.a); //undefined

如果一个函数的返回值是一个值类型,那么这个函数作为构造函数用new运算符执行构造时,它的返回值将被丢弃。new 表达式的结果仍然是this所引用的对象。

1
2
3
4
5
6
7
8
9
10
11
function fee(){
this.a=1;
return 2;
}
var e = new fee();
var f = fee();
alert(e); //object
alert(e.a); //1

alert(f); //2
alert(f.a); //undefined