javascript构造函数返回值详解


  在说JavaScript构造函数返回值的问题前,我们先来了解new操作符:new操作符的作用就是实例化一个用户定义的对象类型(在javascript可以称之为对象也可以称之为函数也可以称之为类),new的基本语法:

new constructor[([arguments])]


  其中constructor是一个函数,它定义了实例化对象的类型。
arguments是constructor调用时所需的值。
创建用户定义的对象至少需要两个步骤:
1;通过创建一个function定义一个对象类型。
2:通过new实例化一个对象。
可以连同指定的名称和属性创建一个对象类型。
当new foo(…)这行代码执行时,有下列事情依次发生:
1:一个对象将被创建,它将继承foo.prototype。
2:这个构造函数foo将连同指定的参数被调用,this指针将绑定到新创建的对象上,如果没有参数提供,new foo()也等同于new foo。
3:一个对象将通过foo构造函数返回,返回的值将是整个new表达式执行的结果。假如这个foo构造函数没有明确返回一个对象,那么这个对象的创建过程将回到第一步。
通常情况下构造函数没有明确的返回值,如果有需要的话你可以覆盖js默认的处理.如以下示例代码:


    function foo() { return true; }
    var a = new foo;
    console.log(a);//foo,因为foo这个构造函数没有明确返回一个对象,所以创建过程回到第一步
    function foo() { return []; }
    var b = new foo;
    console.log(b);//[],因为foo构造函数明确返回了数组对象,此时b继承Array.prototype,b.constructor是Array

  通过以上的论述,相信大家已经明白在js中构造函数返回值的问题,通常情况下不建议在构造函数中指明返回的值(让js实施器自己去处理)。我想如果你真的需要指明构造函数返回的值,我建议你是不是应该重写你的代码,不要用构造函数的形式编写。

<script>
    //没有返回值
    function Test0(){
        this.name='test0';
    }
    var test0=new Test0;
    //debugger;
    alert(test0);//输出[Object]
    alert(test0.name);//输出test0
    //return 一个字符串对象
    function Test(){
        this.name='test';
        return new String('123');// 返回字符串对象
    }
    var test=new Test();
    alert(test);//输出123
    alert(test.name);//输出undefined,说明有构造函数创建的对象是字符串对象
    //return 一个原始类型字符串
    function Test2(){
        this.name='test2';
        return '123';// 返回字符串对象
    }
    var test2=new Test2();
    alert(test2);//输出[Object]
    alert(test2.name);//输出test0
</script>

参考资料

http://www.bennadel.com/blog/2522-providing-a-return-value-in-a-javascript-constructor.htm
http://stackoverflow.com/questions/1978049/what-values-can-a-constructor-return-to-avoid-returning-this
http://stackoverflow.com/questions/3350215/what-is-returned-from-a-constructor

加支付宝好友偷能量挖...


原创文章,转载请注明出处:javascript构造函数返回值详解

评论(0)Web开发网
阅读(337)喜欢(0)JavaScript/Ajax开发技巧