JavaScript中的this

通过这样的方式也可以把一个独立的函数的作用域变成一个对象:

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() 进行类型判断

你可能感兴趣的:(JavaScript)