JavaScript设计模式基础之this、call、apply

1.this的指向

除去不常用的with和eval,具体应用中this指向大概能分为4种情况分别是

  1.作为对象的方法调用。

  2.作为普通函数的方法调用。

  3.Function.prototype.call或Function.prototype.appy

1.如果作为对象方法的调用,this是指向该对象:

 let obj = {
            objName:'obj',
            objThis(){
                alert(this.objName);
            }
        }    
        obj.objThis();

输出如下:

对象obj里面的方法objThis的this是指向该对象

2.作为普通函数调用,this指向全局对象也就是window对象

var objName = 'window';
        //  let obj = {
        //     objName:'obj',
        //     objThis(){
        //         alert(this.objName);
        //     }
        // }    
        function objThis(){
            alert(this.objName);
        }
        objThis();

输出:

函数里面的this默认指向全局window

3.构造器调用(es6类调用),this指向实例化对象

class Obj{
            constructor(str,nub){
                this.str = str;
                this.nub = nub;
            }
            num(){
                console.log(this.str,this.nub,this)
            }
        }
        //类实例
        let obj = new Obj('hello',123);
        obj.num();

输出:

this输出的是类的实例对象 构造函数或者类中this指向自身实例

总结:在谁里面使用this,this指向谁

2.call和apply

1.区别

  appy接收2个参数,第一个参数指定函数体内this对象的指向,第二个参数为一个带下标的集合,这个集合可以为数组,也可以为类数组,appy方法吧这个集合中的原生

  作为参数传递给呗调用的函数。

  call传入的参数数量不固定第一个参数和apply相同,后面的每个参数依次传入只是不是以集合的方式而是参数的方式

     //apply
        let apply1 = function(){
            alert(arguments)//输出[1,2,3]
        }
        apply1.apply(null,[1,2,3])
        //call
        let call1 = function(){
            alert(arguments)//输出[1,2,3]
        }
        call1.call(null,1,2,3)

call是包装在apply上面的语法糖,如果我们传入的第一个参数是null,那么函数体内的this会默认指向宿主对象,在浏览器中就是全局window 

call和apply能改变this指向和借用其他对象的方法 这里就不一一阐述了 网上特别多 

为后面的设计模式做基础 是必须会的

原文地址:https://www.cnblogs.com/y-y-y-y/p/9655706.html