关于js中call方法的理解

之前一直对js中call的使用非常模糊,官方的解释:,“调用一个对象的一个方法,以另一个对象替换当前对象“,看了以后更加懵逼。
先用一个简单的例子感受下

function class1() {
    this.name = 'class1';
    this.show = function() {
      alert(this.name);
    }
  }

  function class2() {
    this.name = 'class2';
  }
  var cs1 = new class1();
  var cs2 = new class2();
  cs1.show.call(cs2);
  //返回
  //class2

从上面的例子可以看出,call改变了class1中的this对象,将this变为了cs2,cs1.show.call(cs2)可以看成下面这段代码

function class2() {
    this.name = 'class2';
    this.show = function() {
      alert(this.name);
    }
  }
var cs2 = new class2();
cs2.show();

这里就可以看出有点继承的意思了。
call的第一个参数是用来替换调用call的方法中的this对象,若方法中没有this对象,会直接忽略掉传过来的对象,这个参数可选,也可以为null或undefined。

再看下下面的代码

function class1() {
    this.name = 'class1';
    this.show = function() {
      alert(this.name);
    }
  }

  function class2() {
    this.name = 'class2';
  }
var cs2 = new class2();
class1.call(cs2);//这里将class1中的this全替换成了实例cs2
cs2.show();//返回class1

执行了class1.call(cs2)后,class2可以看成

function class2() {
    this.name = 'class2';
    this.name = 'class1';
    this.show = function() {
      alert(this.name);
    }
  }

可以看出class2的name属性被this.name=’class1’覆盖了。
我们再看看直接把方法作为call的参数

function class1() {
    this.show = function() {
      alert(this.user);
    }
  }

  function class2() {
    this.user = "wenjl";
  }

  function testCall() {
    class1.call(class2);
    alert(class2.show);//返回 function(){alert(this.user)}
    alert(class2.user);//返回undefined
    class2.show();//返回undefined
  }

这里需要注意的是user这个属性是属于class2的实例的而不是这个类的,而class2.show有值是因为直接把show这个函数赋给了class2这个类。

我觉得个人目前很少有用到call方法,但了解这个方法对js的继承和作用域的了解还是有一定的帮助
(个人观点,烦请指正)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值