new Person()
- 1、创建一个空对象obj
- 2、继承,让这个空对象的__proto__ 等于Person.prototype
- 3、执行构造函数,this绑定这个空对象,得到返回值res
- 4、返回:res是引用类型,就返回res,否则是基础数据类型,就返回obj
- 基础类型返回空对象obj
- 引用类型返回引用类型res
创造一个全新的对象 这个对象会被执行 [[Prototype]] 连接,将这个新对象的 [[Prototype]] 链接到这个构造函数.prototype 所指向的对象 这个新对象会绑定到函数调用的 this 如果函数没有返回其他对象,那么 new 表达式中的函数调用会自动返回这个新对象
模拟代码:
function myNew(fn, ...args) {
// 1、创建一个空对象
const obj = {};
// 2、将该对象的 __proto__ 属性链接到构造函数原型对象
obj.__proto__ = fn.prototype;
// 3、将该对象作为 this 上下文调用构造函数并接收返回值
const res = fn.apply(obj, args);
// 4、如果返回值存在并且是引用数据类型,返回构造函数返回值,否则返回创建的对象
return typeof res === "object" ? res : obj;
}
const c = myNew(Person, "b"); c.say();
追问: new 一个添加了bind的构造函数,实例会继承bind绑定的对象吗?
- 不会\
- bind()方法主要就是将函数绑定到某个对象,bind()会创建一个函数,函数体内的this对象的值会被绑定到传入bind()中的第一个参数的值,例如:f.bind(obj),实际上可以理解为obj.f(),这时f函数体内的this自然指向的是obj。\
- new方法绑定优先级高于bind,他会重新生成一个新的干净的实例。\
- this 绑定四大规则,优先级排序为 new > 显示 > 隐式 > 默认\
- 默认绑定(非严格模式下this执向window,严格模式指向空对象{})\
- 隐式绑定(类似setTimeout以及对象内非箭头函数中,this都是指向window)\
- 显示绑定(call, apply, bind)\
- new 绑定