new的特点
1.new 一个构造函数,会自动reutrn一个实例化对象
2.new完的实例化对象____proto___指向构造函数的prototype
3.new构造函数传参自动赋值给当前实例化对象
function Animal(type) {
this.type = type; // 实例上的属性
}
Animal.prototype.say = function () {
console.log('say');
};
let animal = new Animal('高级动物');
console.log(animal.type); // 高级动物
animal.say(); // say
// 把new关键字 改成一个函数 这样调用 mockNew(Animal, '高级动物')
function mockNew() {
let Constructor = [].shift.call(arguments); // 拿到传入的第一个参数(构造函数)
let obj = {}; // new出来的实例对象
obj.__proto__ = Constructor.prototype; // 实例对象的__proto__ 应该继承构造函数Constructor的prototype
let r = Constructor.apply(obj, arguments); // 除了原型上的属性 还要继承实例上的属性
return r instanceof Object ? r : obj; // 如果构造函数返回了一个引用类型,则返回这个引用类型 否则返回新的obj
}
mockNew(Animal, '高级动物');