this的指向主要分为以下四种:
作为对象的方法调用
作为普通函数调用
作为构造器进行调用
Function.prototype.call
或是Function.prototype.apply
进行调用
作为对象的方法进行调用
当函数作为对象的方法被调用的时候,this
指向该对象。
var obj = {
a : 1,
getA : function (){
alert( this === obj) //true
alert(this.a) // 1
}
}
最为普通函数调用
当函数并不作为对象的属性被调用的时候,就是我们常说的普通函数的调用,这个时候this
总是指向全局的。
window.name = 'globalName';
var getName = function (){
return this.name;
}
console.log(getName()); //globalName
//另外一种写法
var myOwnObject ={
name :'kim',
getMyName : function(){
return this.name;
}
};
var getName = myOwnObject.getMyName ;
console.log(getName()); //globalName
在这种情况下,有的时候我们想要获取并不是全局的this
,我们采取的措施是现将这个this
进行存储,在下面进行调用就好。
构造器调用
JavaScript
没有类的概念,但是可以从构造器中创建对象,同时也提供了new
的运算符,让我呢吧的构造器看起来更像一个类。当运用new
运算符调用函数的时候呀,该函数会返回一个对象,在一般的情况下构造器里面的this
会指向这个返回的对象。
var MyClass = function(){
this.name = 'kim';
};
var obj = new MyClass();
alert(obi.name); // kim
但是如果我们的构造器显示的返回了一个Object
类型的对象,那么此次运算结果最终就会返回这个对象,我们之前期待的this
不会出现了。
var MyClass = function(){
this.name = 'kim';
return{
name:'lala'
}
};
var obj = new MyClass();
alert(obi.name); // lala
但是如果构造器不显式的返回任何数据,或者是返回一个非对象数据类型的数据,不会造成上面的问题。比如说返回一个String
类型的数据,就不会改变上述的问题。
Function.prototype.call或是Function.prototype.apply进行调用
Function.prototype.call
或是Function.prototype.apply
进行调用可以动态的改变传入函数的this
:
var obj1 ={
name: 'kim',
getName: function(){
return this.name;
}
};
var obj2 ={
name : 'lalal'
};
console.log(obj1.getName()); //kim
console.log(obj1.getName.call(obj2)); //lala
this丢失
var obj1 ={
name: 'kim',
getName: function(){
return this.name;
}
};
console.log(obj.getName()); //kim
var getName2 = obj.getName;
console.log(obj1.getName2()); //undefined
今日一讲:当调用obj.getName
时,其中getName
方法是作为obj
对象的属性被调用的,所以this
指向的是obj
对象,当用另外一个变量getName2
来引用obj.getName
,并且调用getName2
,这是一个普通函数的调用,this
指向的是全局。
网友评论