关于call和apply在在实例化的时候使用问题

关于call和apply在在实例化的时候使用问题

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>Document</title>

</head>

<body>

    <script>  

        function Animals(name,food){

      this.name = name;

      this.food = food;

      this.say = function(){

      alert(this.name +'喜欢吃'+ this.food);

      }

     }

     function dog(name,food){

      this.name = name;

      this.food = food;

     };


     var gou = new dog('狗狗','骨头');

     var animal = new Animals();

     animal.say.call(gou);//这个可以实现没问题,把狗当对象传入

     // animal.say.call(dog,'狗狗','骨头');

     //这个就是老师说的call后面传入的是方法,加参数1,参数2,为什么弹出的是dog喜欢吃undefined;不理解call在实例化使用方面该怎么传参。

    </script> 

</body>

</html>

还有个例子就是下一个题目两个数组相加的例子,arr1和arr2,实现方法是

arr1.push.apply(arr1,arr2);这里为什么要两个参数呢,数组的push方法里面只需要一个参数啊,就是要加入的新元素。如果说这里arr1只是起到占位作用,为什么我用空数组[]就过就显示为空呢。


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

你好同学,解答如下:

1.call的第一个参数应该是对象,像 animal.say.call(gou);中的gou是一个实例化对象,所以没有问题。

而animal.say.call(dog, '狗狗', '骨头');中的dog是一个函数,正常情况下应该输出”undefined喜欢吃undefined ”。但是能够输出“dog喜欢吃undefined”中的dog是因为name的原因。函数有一个name属性,它获取的就是函数名称,即输出的是如下定义的函数名:

http://img1.sycdn.imooc.com//climg/5d00a99c00019e6a04290073.jpg

所以animal.say.call(dog, '狗狗', '骨头');是不正确的哦。

2.第二个问题同学说的是不是如下情况,可以参考理解,如果没有解答疑惑,可以把自己有疑惑的代码粘贴上来,以便老师准确的为你解答

http://img1.sycdn.imooc.com//climg/5d00a9dd0001da7411200312.jpg

祝学习愉快 ,望采纳。

  • 慕码人9542252 提问者 #1
    call和apply的使用可不可以这么理解: 1.在构造函数中使用就是就是函数对应函数,比如chlid(){parents.say.call(this,name,age);} 2.而在实例化中使用就要实例对应实例比如animal.say.call(gou);两者不能混用 3.他们后面的参数第一个都是作用域,如果是构造函数就是this表示子类函数的作用域;如果是实例就是实例对象的所在的作用域; 4.后面的参数根据方法他需要的参数而定。 老师能用数组的splice方法结合apply给我实现一下arr1,arr2的操作么?
    2019-06-12 16:01:38
  • 好帮手慕夭夭 回复 提问者 慕码人9542252 #2
    同学可以这样理解。另外,splice方法不能实现这个效果的哦。
    2019-06-12 17:35:20
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师