关于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; 看结果更直接 |