new操作符

摘抄自《JavaScript-Core-and-Practice-V0.9.9b》

        有面向对象编程的基础有时会成为一种负担,比如看到new的时候,Java程序员可能会认为这将调用一个类的构造器构造一个新的对象出来,我们来看一个例子:

        function Shape(type) {

                this.type = type || 'rect';

                this.calc = function() {

                         return   'calc, ' + this.type;

                }

        }

        var triangle = new Shape('triangle');

        console.info(triangle.calc());

        var circle = new Shape('cricle');

        console.info(circle.calc());

        运行结果如下:

        calc, triangle

        calc, circle

      Java程序员可能会觉得Shape就是一个类,然后triangle, circle即是Shape对应的具体对象,而其实JavaScript并非如此工作的,罪魁祸首即为此new操作符。在JavaScript中,通过new操作符来作用于一个函数,实质上会发生这样的动作:

       首先,创建一个空对象,然后用函数的apply方法,将这个空对象传入作为apply的第一个参数,及上下文参数。这样函数内部的this将会被这个空的对象所替代:

       var triangle = new Shape('triangle');

       //上一句相当于下面的代码

      var triangle = {};

       Shape.apply(triangle,['triangle']);

/*********************************************************************************************************/

      不过在实验的过程中,我发现上述语法只适合不增加Shape原型链方法的基础上,如果增加了原型链方法,那么只能new,不能用定义空对象,调用apply方法的方式了。因为apply方法,只会把Shape函数的基本方法,变量,属性分配给原来的空对象,原型链里的对象就不能分配给空对象了。

     例如:

            function Person(name){
                   var address = 'The Earth';
                   this.getAddress = function(){
                            return address;
                    };
                    this.name = name;
            }
  
            Person.prototype.getName = function(){
                   return this.name;
             }
  
            Person.prototype.setName = function(){
                   this.name = name;
            }

            方式一:采用空对象形式

            var jack = {};

            Person.apply(jack,['jack']);

            console.info(jack.name);//jack

            console.info(jack.getName());//这个方法会报错:undefined is not a function

            console.info(jack.address);//由于上边出现异常信息,此行代码不会执行

            console.info(jack.getAddress());//由于上边出现异常信息,此行代码不会执行

            方式二:采用new的形式

            var jck = new Person('jack');

            console.info(jack.name);//jack

            console.info(jack.getName());//jack

            console.info(jack.address);//undefined

            console.info(jack.getAddress());//The Earth

 

            通过这两个例子说明,采用空对象与apply结合的方式执行函数内的函数,在不执行原型链方法的时候可以等价于new对象的形式,但是在需要执行原型链方法的时候,必须用new对象的形式,这样才不会出错。

 

你可能感兴趣的:(new操作符)