js new的原理解析

new 的使用场景:一般是用来创建一个 obj 实例的。

代码分析:

function People(name) {   // 构造函数可以直接以函数的方式来使用
	this.name = name;
	console.log(this);
	return {name: name};
}

var p1 = new People("zlq");
var p2 = People("zs");

console.log(p1);
console.log(p2);

结果如下:
在这里插入图片描述
结论:

  • new之后,this指向是一个People实例对象,正真的实例化了对象
  • 以函数的方式调用的时候,this指向是window对象

new 实例过程分析:

  1. 创建一个新的空对象
  2. 让新对象的 __proto__ 成员对象指向构造函数的 prototype 成员对象 – 实则产生的是一个新的上下文
  3. 使用 call 或 apply 调用构造函数,为新对象添加属性、方法
  4. 判断第 3 步中的值,如果构造函数没有返回其他对象,那么返回this,即新的对象,否则返回构造函数中返回的对象
// 代码解析
new people() = {
	let obj = {};
	let [constructor, ...args] = [...arguments];  // 第一个参数是 构造函数
	obj.__proto__ = constructor.prototype;
	let res = constructor.apply(obj, args);
	return typeof res === 'object' ? res : obj;
}

此番操作后新对象的原型链:
obj.__proto__ ==> People.prototype ==> Object.prototype ==> null;
obj 继承了 People 原型上的属性、方法,即实现了继承。

结论:
new 操作符,可以创建一个原型对象的实例对象,并且继承了原型对象的属性、方法,故new不仅仅是实例化一个对象,同时也实现了 js 的继承。 可与 es6 中的 class 继承作对比,this的指向获取方式不同。

温馨提示: 文章参考部分博客及个人理解,如有错误,请大家及时指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值