js中new关键字原理分析

js中new关键字原理分析

朋友面试中遇到这个问题,虽然原理不难,但是要想严谨地描述出来还是有点难度的。这里做出总结,以备不时之需。

var Person = function(name){
   this.name  = name;
}
Person.prototype.sayHello = function() {
    console.log('hello ' + this.name);
}
//创建一个叫xiexun的人
var p1 = new Person('xiexun');
p1.sayHello();

输出结果

hello xiexun

当我们使用new 关键字创建一个对象时,内部实际进行了如下操作:

  1. 创建一个实例:创建一个空对象obj,然后把这个空对象的__proto__设置为Person.prototype(即构造函数的prototype);
  2. 初始化实例:构造函数Person被传入参数并调用,关键字this被设定指向该实例obj;
  3. 返回实例obj。
function New(F){
    var obj = {'__proto__': F.prototype};  /*第一步*/
    return function() {
        F.apply(obj, arguments);           /*第二步*/
        return obj;                        /*第三步*/
    }
}