javascript - 请教下 js中 new的内部作用原理
PHPz
PHPz 2017-04-10 17:57:24
[JavaScript讨论组]

这下面是我对整个 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的内部作用原理

PHPz
PHPz

学习是最好的投资!

全部回复(4)
天蓬老师

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

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

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

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

迷茫

虽然我英语很烂,不能完全看懂下面的描述,但是很明确的一点是: 对象的创建和原型的处理是在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。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号