日期:2014-05-16  浏览次数:20339 次

为啥构造函数实例化必须用new关键字呢
而普通函数即不需要,为啥啊
------解决方案--------------------
new是构建一个空的对象后将this指向这个空对象  不new的话this会指向window  具体看上下文
------解决方案--------------------
因为new是一个操作符,跟-,+是一样的,是js基础语法的一部分,不同只是他是由字母组成的。
new是有前提的,只有js的函数对象才可以new,这就不展开了,很多细节。
然后new之后会返回一个实例化的对象,这个new的过程是js面向对象实现的具象化操作,如果不用new,那就不能实现面向对象化编程,不能代码尽可能的复用。
如果按着你的说法,或1楼的代码化实现是这样的,sayName是没办法调用的。

var Dog = function(name, age){
    this.name = name;
    this.age = age;
}
Dog.prototype = {
    constructor : Dog,
    sayName : function(){
        console.log(this.name);
    }
}

Dog('jikey', 4);
console.log(this.name == window.name); // true
console.log(this.name); // jikey
console.log(this.age); // 4


然后用了new之后的情况,根据这个模板可以复制很多个dog2,dog3出来。

var Dog = function(name, age){
    this.name = name;
    this.age = age;
}
Dog.prototype = {
    constructor : Dog,
    sayName : function(){
        console.log(this.name);
    }
}


var dog2 = new Dog('tang', 5);
dog2.sayName();

var dog3 = new Dog('csdn', 10);
dog3.sayName();