在调用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除外)拥有的对象,二者关系这里就不赘述了
网友评论