JS中new的原理及实现

在调用new的过程中做了四件事:

1.新生成对象
2.链接到原型
3.绑定this
4.返回新对象

接下来就针对这几点,实现类似new的方法

	//定义create方法
	function create(){
		//定义空对象
		let obj = {};
		//取出参数列表的第一个参数(构造函数)
		let Con = [].shift.call(arguments);
		//手动指正obj的构造函数为Con(链接原型)
		obj.__proto__ = Con.prototype;
		//调用Con,改变this为obj,传入剩余参数arguments
		let result = Con.apply(obj,arguments);
		//考虑到Con函数中有return的原因,需要对result进行判断
		return result instanceof Object ? result : obj
	}

现在便可以通过 create(构造函数,参数)来创建对象

注:

1.关于[].shift.call(arguments)

因为arguments是类数组对象,虽然有length属性,但是没有shift方法,故通过call方法改变执行上下文调用shift方法

2.关于obj.proto = Con.prototype

链接原型使用,__proto__是每个对象拥有的隐藏属性,指向它构造函数的原型,prototype是每个函数(Fuction.prototype除外)拥有的对象,二者关系这里就不赘述了

发布了2 篇原创文章 · 获赞 9 · 访问量 177

猜你喜欢

转载自blog.csdn.net/weixin_42434189/article/details/104411656