Js中的Applyg和call

/*定义一个Person类*/
  function Person(name,age)
  {
    this.name=name;
    this.age=age;
  }
  
  /*定义一个学生类*/
  function Student(name,age,grade)
  {
   /*第一种方法:使用apply*/
   /*Person.apply(this,arguments);*//*this指代student对象,只接受两个参数,arguments为
   隐式数组对象,用来接受传入的参数*/
    Person.call(this,name,age);
    /*我理解的这行代码的意思就是让student对象继承Person对象的属性*/
    this.grade=grade;
  }
  /*实例化Student对象*/
  var student=new Student("Huaicui Zheng",22,"研究生二年级");
  alert("姓名:"+student.name+'\n'+"年龄:"+student.age+"\n"+"年级:"+student.grade);

Bind方法:

var Lilei={
    name:'Lilei',
    speakEnglish:function (word1,word2,word3) {
     /* console.log(this);*/
      console.log(this);
    console.log('HanMeimei'+" "+word1+" "+word2+" "+word3);/*输出:HanMeimei I Love You*/
    }
  }
  var HanMeimei={
    name:"HanMeimei"
  }
  Lilei.speakEnglish('I','Love','You');
  var fn=Lilei.speakEnglish.bind(HanMeimei);/*将作用域改为“HanMeimei”*/
  fn("Love","You","!");/*输出:HanMeimei Love You !*/

**总结:**三种方法中的call()和apply()方法很相似,只是传入的参数不同,一个维参数列表,一个为数组,bind()方法与他们不一样,虽然都是改变this的指向,但是结果不一样。BInd()方法返回的是一个新的方法,它是一个完全独立的函数,做个比喻,就是call()和apply()借用的函数都是暂时的,而且是马上执行,bind()方法就是复制的一份,它是永久的,而且可以在需要的时候调用,下面案列中的fn的this指向HanMeimei,而且是永久的指向HanMeimei。

下面我们来看一下牛客网上的测试题: 将函数 fn 的执行上下文改为 obj 对象。

输入:

  function () {return this.greeting + ', ' + this.name + '!!!';}, {greeting: 'Hello', name: 'Rebecca'}
    输出:
    Hello, Rebecca!!!

思路:call、apply方法可以用来代替另一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始的上下文改变为thisObject指定的新对象,如果没有提供thisObj参数,那么Global对象被用于thisObj。

下面是一个事例代码:

function fn()
{
  return this.greeting+this.name;
}
var s={
  greeting:"Hello,",
  name:"Huaicui Zheng"
};
console.log('将函数的上下文改为obj指定的新对象',fn.apply(s));/*Hello,Huaicui Zheng*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值