javascript - js的实例化过程究竟是怎么样的?
怪我咯
怪我咯 2017-04-10 17:53:40
[JavaScript讨论组]
var a = new B()

这么一句话,过程是怎么样的?
网上看到,实例化过程大概这样
使用了new关键字后,B类内会发生这样一个过程

    B() {
        this = {}   //第一步
        this.name = 'car';   //第二步
        return this;   //第三步
    }

这是对的吗?上面代码应该只是对这个过程的描述而已吧,js内部实现确实是这样吗?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(4)
ringa_lee

如果要研究内部的运行机制,那建议你看ECMAscript5/6。

PHP中文网

这个:https://segmentfault.com/n/1330000004559982更精确一些。

如果你想深入,建议去看ECMAScript规范中关于new关键字的语意描述部分。

当然,如果有能力你可以去找个JS引擎的源码去看一下。

伊谢尔伦
function A( name ){
    this.name = name;
}
 
function ObjectFactory(){
    var obj = {},
        Constructor = Array.prototype.shift.call( arguments );
    obj.__proto__ =  typeof Constructor.prototype === 'number'  ? Object.prototype :  Constructor.prototype;
    var ret = Constructor.apply( obj, arguments );
    return typeof ret === 'object' ? ret : obj;
}

var a = ObjectFactory( A, 'xuecheng' );
 
console.log(a.name);

上面这段代码实现了new关键字的功能,js模拟创建对象过程。
在语法上跟new关键字不同,new关键字语法功能是浏览器对ECMAScript的实现。
通过这段代码我们看看实例化一个对象需要具备哪些东西。
①首先需要在内存中创建一个空对象,{}这种语法被称为字面量表示法,通过这种语法,浏览器在内存中创建一个对象。
②然后将等价于new关键字(在功能上等价)的函数ObjectFactory第一个参数作为实例对象的构造函数,简历索引关系。
③通过__proto__建立实例对象与原型对象的联系。
④将构造函数的属性方法创建一份副本并挂载到实例对象上,最后返回实例化完成的对象。

大致过程如以上部分,当然这是通过js来模拟实现的,具体浏览器如何实现要看浏览器的源代码(一般为c++程序)。

大家讲道理

new 是js函数调用的一种方式

说js实例化有点牵强,在java中,有类和对象。
类是一个模板,对象就是它的实例化。而在javascript中没有类的概念,一切皆对象。

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

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