js中new一个函数的时候,到底发生了什么

时间:2022-05-22 20:14:31
function x(){
            debugger
            this.w=1
            this.a()
        }
        x.prototype={
            a:function(){
                alert(22)
            }
        }

        console.log(new x())

通过单步调试我们可以看到,在断点处,我们输出this的时候,this对象已经完成了基本的构建,也就是说this代表的是一个对象,并且已经完成了原型链的构建,继续往下执行的时候,只是在this代表的这个对象里增加新的属性,并且可以调用原型中的属性了。

当我们new一个函数的时候,在执行函数里的第一条语句之前,首先创建一个空的对象{},并且this等于这个空对象,并且已经完成了原型链的构建,接下来就是执行函数里的代码,最后返回一个这个对象,除非我们显示返回其他的对象,否则一律返回this代表的这个对象。在v8中,在执行函数的代码之前,还会创建隐藏类等信息,是v8引擎对js代码的优化,使得js能像静态语言一样高效,具体有待继续研究。