直接上代码
function myNew() {
// 创建一个空对象
let obj = new Object();
// shift删除数组第一个元素,并返回一个元素。原有arguments数组第一个参数是构造函数,返回值为构造函数。
const Constructor = [].shift.call(arguments);
// 将 obj 的原型指向构造函数,这样 obj 就可以访问到构造函数原型中的属性
obj.__proto__ = Constructor.prototype;
// 执行构造函数的方法
const ret = Constructor.apply(obj, arguments);
// 返回构造函数中有返回值且返回值是个引用类型,没有返回值则默认返回这个对象
return typeof ret === 'object' ? ret : obj;
}
function Person(name, age) {
this.name = name;
this.age = age
// 模拟有返回值且是个对象
return {
name: name,
test: '测试'
};
}
const a = myNew(Person, 'zh', 18);
console.log(a.name); // zh
console.log(a.test); // 测试
console.log(a.age); // undefined