This的指向规则:
- 谁调用就指向谁。
- 事件监听函数内部,this会指向监听的那个元素节点。
- 在构造函数中,this指向New出来的新对象。
- 对于箭头函数,自身没有变量,所有指向环境中的this。
- 如果一个函数没有被调用,也就是普通调用,this指向全局变量。
- 在严格的情况下,this为Undefined。
New实例化过程
-
创建一个空的对象。
例如:
let obj = { }
-
将该对象的 _ _ proto _ _指向类的原型对象。
-
绑定该函数内部的this,指向这个对象。
-
执行这个函数并且将this作为返回值返回。
call实现不传参对象
:
<script>
function myNew(fn) {
// 以构造函数fn的prototype为原型 创建一个新的简单对象
let A = Object.create(fn.prototype)
// 改变fn的this指向到A,并执行fn
let B = fn.call(A);
// 如果构造函数没有返回对象,则返回A
if (typeof B === 'object') {
return B;
} else {
return A;
}
}
</script>
apply传参
:
<script>
function myNew(fn, ...args) {
// 以构造函数fn的prototype为原型 创建一个新的简单对象
let A = Object.create(fn.prototype)
// 改变fn的this指向到A,并执行fn
let k = fn.apply(A, args);
// 如果构造函数没有返回对象,则返回A
if (typeof k === 'object') {
return k;
} else {
return A;
}
}
</script>