RT
  好多代码中去掉new照常运行,结果一样,为什么还要加个new呢?

解决方案 »

  1.   

        以new的方式运行的话,函数会被当成一个构造函数,从而得到一个对象。也可以说,new是一个运算符,这个运算符的执行结果是一个对象。
        如果不以new的方式执行函数的话,那就是一个普通函数。普通函数的返回值,就由函数决定了。
      

  2.   

    这个完全不能用一句可有有无来解释的。js语法比较灵活,有很多地方和C++、Java不太一样。难度还是很大。而且现在随着云计算的火热,js还是很受欢迎的,建议花时间好好学。
      

  3.   

    结果当然不一样。
    js的new可以看成是一个代理模式的代理类。包裹了new 后面的函数处理顺序为
    1.创建一个function对象,并将prototype设置为传入函数
    2.执行传入函数
    3.判断传入函数返回值,如果为null,则返回第一步的function对象。可能以下代码比较难理解,我模拟了一个new所作的事情。封装在newInstance方法里。
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
    <title>Insert title here</title>
    <script type="text/javascript">
    function Animal(name) {
    this.name = name;
    }
    Animal.prototype.sayName = function() {
    alert("My name is " + this.name);
    }
    function newInstance(fn) {
    var Class = function() {};
    Class.prototype = fn.prototype;
    var slice = Array.prototype.slice;
    var args = slice.call(arguments);
    args.splice(0, 1);
    var instance = new Class();
    var result = fn.apply(instance, args);
    return result ? result : instance;
    }
    var cat = newInstance(Animal, "Jack");
    cat.sayName();
            alert(cat instanceof Animal);
    </script>
    </head>
    <body>

    </body>
    </html>
      

  4.   

    另外,由于w3c注意到基于prototype的构造方式过于复杂。。在ECMAScript5中,以Object.create来代替new。所以以后用new的机会不多了。
    详细可以看我javaeye上的博文
    http://rainsilence.iteye.com/blog/1026530
    http://rainsilence.iteye.com/admin/blogs/892002