<script>
/*
在调用new的过程中会发生以上四件事
1,首先创建一个新的空对象
2,设置原型,将对象的原型设置为函数的prototype对象
3,将函数中的this指向这个对象,指向构造函数的代码(为这个新对象添加属性)
4,判断函数的返回值类型,如果是值类型,就返回创建的对象,
如果是引用类型,就返回这个引用类型的对象
*/
function objectFactory(){
let newObject = null
let constructor = Array.prototype.shift.call(arguments)//查看伪数组中第一个参数
let result = null
// 判断参数是否是一个函数,如果不是返回错误
if(typeof constructor !== "function"){
console.log('type error')
return
}
// 新创建一个空对象,对象的原型为构造函数的prototype对象
newObject = Object.create(constructor.prototype)
// 将this指向新建对象,并执行函数,result是函数执行后返回的结果
result = constructor.apply(newObject,arguments)//newObject.contructor(arguments)
// 判断返回对象,是值类型还是引用类型
let flag = result && (typeof result === 'object' || typeof result === "function");
// 判断返回结果
return flag ? result : newObject;
}
// 使用方法
objectFactory('构造函数','初始化参数')
// 测试 :objectFactory(Object,[1,2])
</script>
手写new操作符
最新推荐文章于 2024-08-31 22:57:45 发布