原理
new的原理是什么?通过new的方式创建对象和通过字面量创建有什么区别?
在调用 new 的过程中会发生以下四件事情:
- 新生成了一个对象
- 链接到原型,将新对象的
__proto__属性指向构造函数的prototype属性,继承构造函数原型上的方法和属性 - 绑定
this,将新对象作为this调用构造函数,继承构造函数内部指定的方法和属性。 - 返回新对象
根据以上几个过程,我们也可以试着来自己实现一个 new:
function create(func) {
let obj = {}
obj.__proto__ = func.prototype
let result = func.apply(obj, arguments)
return result instanceof Object ? result : obj
}
分析
- 创建一个空对象
- 获取构造函数
- 设置空对象的原型
- 绑定
this并执行构造函数 - 确保返回值为对象
对于对象来说,其实都是通过 new 产生的,无论是 function Foo() 还是 let a = { b : 1 } 的方式。
对于创建一个对象来说,更推荐使用字面量的方式创建对象(无论性能上还是可读性)。因为你使用 new Object() 的方式创建对象本质上是方法调用,需要通过作用域链一层层找到 Object,产生方法需要的堆栈信息,方法调用结束后释放堆栈,性能不如字面量的方式。
function Foo() {}
// function 就是个语法糖
// 内部等同于 new Function()
let a = { b: 1 }
// 这个字面量内部也是使用了 new Object()
new 一个箭头函数会怎样
箭头函数是 ES6 中的提出来的,它没有 prototype,也没有自己的 this 指向,更不可以使用 arguments 参数,所以不能 new 一个箭头函数。