new
在MDN
上的定义是:new
运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例
在JavaScript中,new是一个关键字,创建了一个对this的绑定.而在面向对象的语言中,new关键字总是用于实例化一个类,如在Dart中:
class Person {}
var p = new Person()
在JavaScript中,没有类的概念(ES6的class也只是语法糖而已),但是我们只要使用函数就能来生成对象.
我们使用构造函数来创建一个对象,构造函数与一般的函数没有什么区别,只不过是在调用的时候加上了new关键字.所以我觉得用构造函数调用来代替构造函数的说法可能更加能够让人接受
function Perons(){}
let p = new Perons()
console.log(p) // Perons {}
那么我们来看一下new
的时候到底干了啥?
- 调用函数
- 自动创建一个新对象
- 将创建的对象和this进行绑定
- 如果构造函数没有显式的返回值,隐式的返回this对象
当运行这句代码的时候,内部的执行大致如下:
function myNew() {
// 创建一个空对象
const obj = new Object()
// 获取构造函数
const fn = [].shift.call(arguments)
// 将空对象的原型赋值为构造函数的原型
obj.__proto__ = fn.prototype
// 变更构造函数内部this,将其指向刚刚创建出来的对象
const result = fn.call(obj, argguments)
// 返回对象
return typeof obj === 'object'? result : obj
}
总结: new到底干了啥,这里我引用MDN中的话
创建一个空的简单JavaScript对象
链接该对象(即设置该对象的构造函数)到另一个对象
将步骤1新创建的对象作为this的上下文
如果该函数没有返回对象,则返回this