this指向问题
在浏览器里,在全局范围内this 指向window对象;
在函数中,this永远指向最后调用他的那个对象;
构造函数中,this指向new出来的那个新的对象;
call、apply、bind中的this被强绑定在指定的那个对象上;
箭头函数中this比较特殊,箭头函数this为父作用域的this,不是调用时的this.要知道前四种方式,都是调用时确定,也就是动态的,而箭头函数的this指向是静态的,声明的时候就确定了下来;
apply、call、bind都是js给函数内置的一些API,调用他们可以为函数指定this的执行,同时也可以传参。
new的过程
1. new的四个步骤
创建一个空对象—>这个新对象继承原函数的原型—>更改this指向,为对象设置属性—>返回新对象
- 创建一个空对象
var obj={}
- 这个新对象继承原构造函数的原型
obj.proto=Constructor.protype
- 更改this指向,为对象设置属性
let result=Constructor.apply(obj,…args)
- 返回新对象
return result instanceof Object?result : obj
2. new的实现过程
function myNew(constrc, ...args) {
// 1. 创建一个空对象
const obj = {};
// 2. 将obj的_proto_属性指向构造函数的原型对象
obj.__proto__ = constrc.prototype;
// 3.将constrc执行的上下文this绑定到obj上,并执行
const result = constrc.apply(obj, args);
//4. 如果构造函数返回的是对象,则使用构造函数执行的结果。否则,返回新创建的对象
return result instanceof Object ? result : obj;
}
- 像普通函数那样执行,形成私有作用域,进行形参赋值,变量提升等一系列操作
- 默认创建一个对象,
- 让这个对象成为当前类的实例,__proto__指向构造函数原型
- 让函数中的this指向这个对象
- 代码执行
- 默认把创建的对象返回