new一个函数主要分为四步,如下:
//注意点:
//构造函数一般不需要return。
//如果return了,并且是引用类型,那么将使用其return值,这时不会存在原型链继承。
/**
* @description: person构造函数
* @return {*}
*/
function Person(name, age) {
this.name = name;
this.age = age;
}
//设置原型方法
Person.prototype.say = function () {
alert(`${this.name}说我今年${this.age}岁了`);
}
//模拟new定义
function newFn(fn,...args) {
let newObj = {};//1. 设置新对象
newObj.__proto__ = fn.prototype;//2. 设置原型链 让新对象继承构造函数
let result = fn.call(newObj, ...args);//3. 将this绑定新对象并执行构造函数,保存其结果(构造函数一般没有结果)
return typeof result === 'object' ? result : newObj;//4. 判断执行结果是否为 object,为object返回执行结果,不为返回新对象
}
//new调用
var obj = newFn(Person,'张三', 18);
obj.say()