JavaScript 中的 new 做了什么

newMDN上的定义是: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值