面向对象的this

//事件调用时
谁调用这个函数,函数里的this就指向谁
与声明没有任何关系
//隐式绑定
function fn(){
    console.log(this.a);
}
var obj2 = {
    a:3,
    fn:fn
}
obj2.fn();//  obj2调用了fn  this==>>obj2
//默认绑定,this指向window
fn();//  这里是window 在调用
//如果是链式对象引用,只有上层或者最后一层在调用作用中起作用。
var obj1 = {
      a:2,
      obj2:obj2
}
obj1.obj2.fn();//this==>>>obj1
/* 这里相当于是obj2:{
	a:3,
	fn:fn
  }*/ //所以是obj2在调用

//显示绑定:使用call或者apply、bind
var a = 1;
function fn(){
     console.log(this.a);
}
var obj1 = {
     a:2
}
fn.call(obj1);//   这里是改变fn的调用对象  改为obj1
//显示绑定可以变种为硬绑定,后面就不能再修改this指向了
var bar = function(){
      fn.call(obj1)
}
bar();
bar.call(window); //this==>>window

构造函数的this

new绑定
//new一个函数是  其实会做3件事  
1.调用这个函数
2.创建一个空对象  函数名={}
(构造函数默认 return {} ,如果有return 出来的不是对象this还是{},比如"",number..,如果return 出来的是一个对象this就指向返回的对象,比如:Arry,Object,..,特例 null 虽然null是对象但this还是{}3.绑定this=返回的对象
function foo(a){
    this.a = a;
    console.log(this) //foo {a: 2}
}
var bar = new foo(2);
console.log(bar.a);

箭头函数的this指向

var a = 3;
function foo(){
     var fn = ()=>{
          console.log(this.a); 
     }
     fn()
}
var obj = {
       a : 1,
       foo:foo
}
obj.foo();//this==>>obj
foo();//this==>>window
不管在什么情况下,箭头函数this跟外层functionthis是一致的,外层function指向谁,箭头函数的this就指向谁,如果外层不是function则指向window
箭头函数里的this的指向是在函数创建的时候绑定的,无关乎谁调用。
从上面例子this的指向总结几点:
1.函数直接调用,如上面例子fn()this指向widow;
2.this指向是在函数执行的时候绑定的,而不是在函数创建的时候绑定的,所以是谁调用就指向谁;
3.匿名函数中,this指向一直指向window;
4.如果把null或者undefined作为this的绑定对象传入call/apply/bind,这些值在调用时会被忽略,实际应用的是默认绑定规则。
创建一个空对象最简单的办法是Object.creat(null),它和{}很像,但是并不会创建Object.prototype,它比{}更空
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值