new的四部曲
1、首先创建一个实例对象
2、然后让构造函数的this指向实例对象
3、让实例对象的__proto__指向构造函数的prototype
4、判断构造函数返回的是引用类型还是基本类型,如果返回的是引用类型,那么new出来的就是这个引用类型,如果返回的是基本类型,那么new出来的就是我们创建的实例。
实现一个new
代码如下:
function mynew(fn,...arg){
// 创建一个实例对象
let obj = {};
// 让实例对象的__proto__指向构造函数的prototyoe,(满足原型链的要求)
obj.__proto__ = fn.prototype;
// 改变this指向
fn.apply(obj,arg)
//判断返回的是不是引用类型
let result = fn()
return typeof(result)==='object'?result:obj
// return Object.prototype.toString.call(result)==='[object Object]'?result:obj
}
搞个题
function Foo(){
this.a = 1;
return {
a:4,
b:5
}
}
Foo.prototype.a=6;
Foo.prototype.b=7;
Foo.prototype.c=8;
var o = new Foo;
console.log(o.a);
console.log(o.b);
console.log(o.c);
答案是:4、5、undefined