new的时候这个命令到底干了什么

假设有个函数

function A (){
    
}

A.prototype = {
    test:function(){
        
    }
}

当我们实例化A的时候会发生如下的事件

1.首先会创建一个新对象

var newOj = new Object();

2.然后这个新对象会继承A的原型prototype (这里需要去看看js的继承,看看对象的__proto__属性,看看prototype是什么)

//也就是会这样做
newOj.__proto__ = A.prototype

3.得到了一个继承至A原型的对象之后,再去调用A构造函数,并且把this指向刚刚创建的新对象

//也就是说会这样做
var oj = A.call(newOj,arguments);

4.得到调用的结果之后,再来判断下,如果返回的oj不是一个对象(A没有返回一个显式的对象)的话,那么就会把newOj 当作实例化的结果返回.

所以最后,我们得到的结果:

var a = new A();

//a的实际内容如下
{
    __proto__:{  //这个就是A的prototype对象,也就是上面第二步的操作结果
        test:fn(),
        __proto__:{//这个则是A继承Object的prototype来的
            constructor:fn(),
            hasOwnProperty:fn()
        }
    }
}

参考: