构造函数
js中通过构造函数实现实例之间的继承,这里通过new 一个对象,将this指向这个对象并返回,同时这个对象继承构造函数原型上的方法
function Animal(){
this.type = "cat"
}
Animal.prototype.say = function(){
console.log("喵喵喵");
}
let animal = new Animal();
console.log(animal.type); //cat
animal.say() //喵喵喵
模拟new
基本思路如下:
- 创建一个函数mockNew,用来模拟new,其参数为构造函数和其它传参
- 在函数中获取构造函数
- 创建一个对象,让其__proto__属性继承构造函数的prototype
- 通过apply让构造函数运行,this绑定为obj,实现对构造函数属性的继承
- 判断构造函数是否有返回对象,若有,则返回这个对象,没有,f返回obj
function Animal(){
this.type = "cat"
}
Animal.prototype.say = function(){
console.log("喵喵喵");
}
function mockNew(){
let Construct = [].shift.call(arguments); //删除数组中第一个元素并返回,这里将构造函数返回
let obj = {} // 创建实例
obj.__proto__ = Construct.prototype //继承构造函数原型
let r = Construct.apply(obj,arguments); //继承属性
return r instanceof Object? r:obj; //判断构造函数是否有返回值
}
let animal = mockNew(Animal);
animal.say()