首页 > 请教下 js中 new的内部作用原理

请教下 js中 new的内部作用原理

这下面是我对整个 js 中对象的认识图 ,不知道队不对:

 null;

    function Object(){
        this.prototype={
            constructor:null,
        };

        this.__proto__=this.prototype;
    };

    function Function(){
        this.prototype={
            constructor:Object.prototype,
        };

        this.__proto__=this.prototype,
    };

    function Arry(){
        this.prototype={
            constructor:Function.prototype,
        };

        this.__proto__=this.prototype;
    };

在此我还想请教下 js中 new的内部作用原理


虽然我英语很烂,不能完全看懂下面的描述,但是很明确的一点是: 对象的创建和原型的处理是在call之前的。

看过很多代码也不敢说是否是正确的
var p = new P()这行代码大致的内部操作是:

1. var p = Object.create(P);
2. P.call(p);
3. return p;

上面的第三步可能是没有的。因为函数的返回值在new操作符下是按下面进行处理的。

  1. 如果没有return语句,则返回上面的p。

  2. 如果有return语句,且return语句返回一个非null的object对象(包括数组,函数),则函数返回的不是this,而是这个object。

  3. 如果有return语句,且return返回的是非object对象,则函数返回p。


简单来说,new操作符执行两个动作:1.实例化一个object类。2.以这个object为上下文执行new后面的函数。就这么简单。


第一个问题,看来题主主要想问的是构造函数,实例和原型三者的关系,这一方面在高程这本书的第六章给了非常清晰的解答,我简单说一下。构造函数中的prototype指向原型,原型中的constructor指向构造函数,实例中的__proto__指向原型,可以看出,实例和构造函数是没什么关系的。

第二个问题,我的理解是,如果没有new,那么函数在没有明确规定返回类型的时候返回undefined,但是如果用new,那么函数会为此分配内存并返回一个该种object的实例。


 1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
 2、属性和方法被加入到 this 引用的对象中。
 3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。
var obj  = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
【热门文章】
【热门文章】