通过这样的方式也可以把一个独立的函数的作用域变成一个对象:
var person={
name:"anna"
}
function independent(){
alert(this.name);
}
person.func = independent;
person.func();//anna
原型链上的this
替换为实例对象本身:
var o={
f:function(){
alert(this.a+this.b);
}
}
var p=Object.create(o); //p的原型对象是o
p.a=1;
p.b=2; //增加实例属性
p.f(); //3
在调用p.f时,会在原型对象o上查找到该方法,原型对象上的this被替换为实际的对象p。
构造器中的this
通过new方法调用一个构造函数,会返回一个对象,这个对象的原型对象是 构造函数.prototype。而构造函数中的this则指向这个返回的对象。如果构造函数中没有写return语句或者返回基本类型的数据,那么会将this返回。
function MyClass(){
this.a=37;
}
var o=new MyClass();
alert(o.a) //37
这里,this指向一个空对象(由new MyClass()返回),由于通过this.a为这个空对象增加了属性a,随后又把返回的对象(this)赋值给o,即o也指向这个对象,因此通过o.a可以访问其属性。总结一句话就是:this指向实例对象。
但是如果构造函数中返回了一个对象,那么就不会返回this,而是将实际的对象返回:
function MyClass2(){
this.a=37;
return{
a:38
};
}
var o =new MyClass2();
alert(o.a); //38
bind和this
想要将方法中的this对象替换成某个对象,就将其作为第一个参数传递给bind。
function f(){
return this.a;
}
var g = f.bind({a:"test"});
alert(g()); //test
var o={
a:37,
f:f,
g:g
}
alert(o.f);//37
alert(o.g);//test
bind可实现一次绑定,多次调用,而不管调用方式是怎么样的,其作用域都是之前绑定好的那个。例如上述代码中的g。这样相比call和apply更方便。
通过 Object.prototype.toString.call() 进行类型判断