你有对象嘛?要不new一个吧!大家喜欢这么开玩笑。那new到底干了些什么呢?
- 将构造函数的原型prototype绑定到返回对象的隐式原型__proto__上
- 执行构造函数时会把this绑定到返回的对象上
- 判断执行完构造函数后的返回值是否为对象,是的话直接返回,否则返回生成对象
代码如下
function myNew(fn,...params){
let newObj = {}
Object.setPrototypeOf(newObj,fn.prototype) //将构造函数的原型prototype绑定到返回对象的隐式原型__proto__上
let resOut = fn.apply(newObj,params) // 执行构造函数时会把this绑定到返回的对象上
return typeof(resOut) === 'object'?resOut:newObj //判断执行完构造函数后的返回值是否为对象,是的话直接返回,否则返回生成对象
}
function Person(name,age){
this.name = name
this.age = age
}
Person.prototype.school = '学校'
let person1 = myNew(Person,'小王',20)
console.log(person1); // Person { name: '小王', age: 20 }
console.log(person1.school); //学校
这样就可以实现new了,那new的左作用是啥呢,就是通过原型来实现继承,在构造函数上定义的字段school,那么通过new生成的实列可以通过原型_proto_来进行访问。