Skip to content

Latest commit

 

History

History
50 lines (37 loc) · 1.64 KB

1.md

File metadata and controls

50 lines (37 loc) · 1.64 KB

代码

var num = new Number(1);
console.log(num)  //Number {[[PrimitiveValue]]: 1}

function foo (name) {
    this.name = name;
}

var bar = new foo('jack');
console.log(bar.name)  //jack

问题

JavaScript中的 new 操作符到底干了什么?

分析

在MDN上对new的解释是这样的,new 运算符创建一个自定义对象具有构造函数的内置对象实例

那么,如何创建呢?

实际上,使用new运算符来调用函数时,会执行以下操作:

  1. 创建一个全新的对象
  2. 这个新对象会被执行[[Prototype]]连接
  3. 这个新对象会绑定到函数调用的this
  4. 如果构造函数返回了一个引用对象,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤3的新对象

可以用如下代码表示:

function New (f) {  
    var n = { '__proto__': f.prototype };       
    return function () {         
        f.apply(n, arguments);  
        return n; 
    }; 
}

让我们测试一下

测试用例

注意,这只是用代码大致描述new运算符的执行过程,方便我们理解过程,并不能替代new运算符,比如步骤4的判断就没有实现

参考资料

国外大神Vjeux的博文

MDN参考文档——new运算符

《你不知道的JavaScript上卷》