JavaScript中this关键字用法较为灵活,用处较多,主要有以下几种方式:
1.浏览器中,全局的this指向window;
console.log(this===window);
console.log(this);
this.a='nice';
console.log(window.a);
验证结果如下:
2.作为对象方法的函数this;
function sum(){
return this.x+this.y;
}
var obj={"x":1,"y":2};
obj.z=sum;
console.log(obj.z());
var obj1={
x:1,y:2,
z:function(){
return this.x*this.y;
}
}
console.log(obj1);
console.log(obj1.z());
验证结果如下:
把函数作为对象属性的值也称作为对象的方法,this指向对象,该属性可理解为需调用方法,使用时需加上().
3.对象原型链上的this;
var o={f:function(){
return this.x+this.y;
}}
var obj=Object.create(o);
obj.x=1;
obj.y=2;
console.log(obj.f());
验证结果如下:
obj的原型是o,通过o的this关键字可以拿到当前对象obj,同时,obj的属性f也可上溯至原型链o。
4. get/set方法与this;
var obj={
x:1,
y:2,
get z(){
return this.x**2+this.y**2;
}
};
function w(){
return Math.sqrt(this.x**2+this.y**2);
}
Object.defineProperty(obj,'w',{get:w,enumerable:true,configurable:true});
console.log(obj.z,obj.w);
验证结果如下:
this可以得到当前对象,便于通过get给当前对象的属性赋值.
5.构造器中的this;
function MyClass(){
this.a=35;
//无return关键字,则返回this;
}
var obj=new MyClass();
//使用new创建,则对象obj会指向MyClass.prototype.
console.log(obj.a);
验证结果为:
this还有许多用到的地方,比如call,apply,bind方法,在此不一一列举。可自行写码验证。