javascript new 运算符

使用New运算符,实例化一个对象,都做了那些事情?

面试时被问到这个问题,虽然自己有自己的理解,但是感觉回答的不是很好,查阅了一下网上的资料,总结一下。

因为js对象都是相互关联的,也就是说,即使是一个空的对象,他的__proto__属性是指向Object的prototype

当我们使用new这个关键字来实例化一个对象时,要注意,new后面必须要是一个对象,并且这个对象要有一个名为construct的方法。首先我们可以模拟一下new的过程,我们写这样一个类:

function Person(name,age){
    this.name = name;
    this.age = age;
}
Person.prototype = {
    walk:function(){
        console.log("This is a 'walk' method!")
    }
}
//构造一个伪construct方法:
Person.construct  = function(){
    var o,Constructor = Person;
    o.__proto__ = Person.prototype;
    Constructor.apply(o,arguments);
    return o;
}
var person = new Person('Bill',18);

如上代码,我们构造了一个伪construct方法,当我们在使用new关键字实例化某个类对象时,首先会触发这个类(其实也是对象,我们称他为一个类)的construct方法。

在这个方法中,我们首先创建了以个空的对象o,并且我们拿到了我们的类(对象)的引用Constructor

接着我们将我们创建的空对象的__proto__指向我们的类的prototype,这样,我们首先实现了基于原型链的继承,接着使用apply方法,让o去调用Person方法,初始化了onameage属性,最后将o返回给我们创建的person变量。

至此,new的过程就结束了。person对象拥有两个自有属性nameage,以及一个继承的方法walk