首页 > js的实例化过程究竟是怎么样的?

js的实例化过程究竟是怎么样的?

var a = new B()

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

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

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


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


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

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


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++程序)。


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

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

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

【热门文章】
【热门文章】