这几天一直学习JavaScript的面向对象,了解了JS的原型链,继承,Call的作用,以及this的指向.
Call()和this的指向this
总是指向调用某个方法的对象,使用call()和apply()方法时,就会改变this的指向
参考MDN,Call()
的作用有这几种
使用Call()
调用父构造函数,来实现继承
function a(name, age) {
this.n = name
this.age = age
}
function b(name, age) {
a.call(this, name, age)
}
var obj = new b('张三', 18)
console.log(obj)
使用 call
方法调用函数并且指定上下文的 'this'
function fn(x, y) {
this.x = x
this.y = y
console.log(this); //{name: "andy", x: 1, y: 2}
}
var o = {
name: 'andy'
};
// fn();
// 1. call() 可以调用函数
// fn.call();
// 2. call() 可以改变这个函数的this指向 此时这个函数的this 就指向了o这个对象
fn.call(o, 1, 2);
this
作为实参的指向
window.addEventListener('load', function() {
function a() {
// this.name = 1;
this.meth = function(obj) {
console.log(obj)
}
}
var o = new a();
console.log(o)
o.meth(this)//Window
严格模式等的this指向问题
- 以前在全局作用域函数中的this指向windows对象
- 严格模式下全局作用域中函数的this是undefined
- 以前构造函数时不加new也可以调用,当普通函数,this指向全局对象
- 严格模式下,如果构造函数不加new调用,this会报错
- new实例化的构造函数指向创建的对象实例
- 定时器的this还是指向windows
- 事件、对象还是指向调用者
- 箭头函数this始终指向window