关于js的new操作的疑问

fzy312 2013-01-17
各位大牛,小弟最近正在学习js方面的东西,读了JavaScript内核系列感觉受益匪浅,但是在学习的过程中也对js中的new产生了一些疑问

JavaScript内核系列第八章中有一段提到:
var triangle = new Shape( "triangle" );
// 上一句相当于下面的代码
var triangle = {};
Shape.apply(triangle, [ "triangle" ]);


按照这个的理解的话,下面的两段代码应该如何来理解:
function fun1()
{
	return function(){};
}
var a = new fun1;
document.writeln(typeof a);//输出function

对于上面这段代码,小弟我原本以为应该输出object,但实际在浏览器环境中输出的是function

function fun2()
{
	return 1;
}
var b = new fun2;
document.write(typeof b);//输出object

按照之前那一段代码的输出结果来分析,小弟我原本以为以上这段应该输出的是number,但实际在浏览器环境中却输出了object

很难理解new真正的作用机制,是否有哪位大牛能为小弟做下解释,万分感激!

---------------------------------------------------------------

补充:

刚才又做了如下这些测试

(function(){
function fun()
{
	this.title = 'title';
	return [];
}
var a = new fun;
document.writeln(a.title);//输出undefined
})();


(function(){
function fun()
{
	this.title = 'title';
	return {};
}
var a = new fun;
document.writeln(a.title);//输出undefined
})();


(function(){
function fun()
{
	this.title = 'title';
	return 1;
}
var a = new fun;
document.writeln(a.title);//输出title
})();


(function(){
function fun()
{
	this.title = 'title';
	return "";
}
var a = new fun;
//var a = {};
//fun1.call(a);
document.writeln(a.title);//输出title
})();


(function(){
function fun()
{
	this.title = 'title';
	return true;
}
var a = new fun;
//var a = {};
//fun1.call(a);
document.writeln(a.title);//输出title
})();


于是我做了这样的猜测:
var a = new fun;
//相当于下面的代码
if(typeof(fun())=="object"||typeof(fun())=="function")
{
    var a = fun();
}
else
{
    var a = {};
    fun.apply(a);
}


希望能有大牛来为我的猜测做个验证,再次拜谢!
guilipan 2013-01-21
通过new实例出来的构造函数的默认返回值是this指向的对象,如果显示返回其他对象则返回其他对象,如果返回非Object类型的如string等,则仍然默认返回this指向的对象
sswh 2013-01-22
fzy312的试验很细致

按照试验结果,guilipan的解释是合理的。

顺便说一下,要查看运算后对象是什么 ,没必要用
document.writeln(a.title);//输出title 这种形式。

在Chrome下按F12,打开Console,
直接输入:
function fun() 

    this.title = 'title'; 
    return true; 

a = new fun;

看结果更直接
Global site tag (gtag.js) - Google Analytics