Array.prototype.xxx.call 请问老师这样的使用在那一章提到了?

Array.prototype.xxx.call 请问老师这样的使用在那一章提到了?

slice、concat、 splice 这些在第一部分数组中有提到使用

而call 和 apply 则是指定上下文

那么这些下面的方法具体的意思能不能解释一下呢,并且Array.prototype.xxx.call 这样的样式在哪节课出现过?

// 02 通过 call 调用数组的 slice 方法来实现转换
// 输出["sdga", "tuftr", empty × 3, "sege"]
console.log(Array.prototype.slice.call(arrLike));

// 03 通过 apply 调用数组的concat 方法来实现转换
// 输出 ["sdga", "tuftr", undefined, undefined, undefined, "sege"]
// []空数组用来存放获取到的数据
console.log(Array.prototype.concat.apply([], arrLike));
// 04通过 call 调用数组的 splice 方法来实现转换
// 输出["sdga", "tuftr", empty × 3, "sege"]
// 表示从0开始遍历console.log(Array.prototype.splice.call(arrLike, 0));


正在回答 回答被采纳积分+1

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

2回答
好帮手慕慕子 2021-04-17 13:57:27

同学你好,对于你的问题解答如下:

1、原型添加类的方法后,通过实例对象打点调用,这个理解是对的,但也可以直接通过原型对象调用添加的方法,老师写了一个简单的小例子,帮助同学更好的理解,如下图所示:

http://img1.sycdn.imooc.com//climg/607a774d0925c99b09580396.jpg

截图中的代码定义了一个构造函数,在该函数的原型对象prototype上添加了一个方法test,然后实例化一个对象f1,f1可以打点调用test方法,也可以直接通过原型对象prototype调用它上面添加的方法。

http://img1.sycdn.imooc.com//climg/607a77560960b1bd02660132.jpg

对比上面的小示例,slice等方法是js内部提供的方法,这些方法是添加在Array的原型对象上的,所以也是可以通过原型对象prototype调用的。

2、slice等方法是属于数组的方法,类数组不可以直接调用的,否则会报错,示例:

http://img1.sycdn.imooc.com//climg/607a78480967dfed10680251.jpg

http://img1.sycdn.imooc.com//climg/607a7854096817f408380217.jpg

而通过Array.prototype.slice.call(arguments)这种方式,可以简单的理解为代码内部会自动将arguments转成一个真正的数组,至于具体是如何转的,这里涉及到js源码的底层原理,我们不用关心,只需要了解Array.prototype.slice.call(arguments)可以将类数组转成数组,将其作为一个特殊知识点,特殊记忆即可

祝学习愉快~

  • 提问者 weixin_慕丝2377090 #1

    谢谢 老师

    对于类数组转换为数组是不是除了这样用原型的方法加call

    还可以使用

    。。。展开符

    Array.from()

    2021-04-18 13:42:25
  • ​是的,可以使用扩展运算符或者Array.from()方法来实现转换。祝学习愉快!

    2021-04-18 16:28:01
好帮手慕慕子 2021-04-17 11:06:48

同学你好,对于你的问题解答如下:

1、Array.prototype.xxx.call这种写法在之前的课程中没有提到。是其他同学们对call和apply方法的灵活应用而已。

2、同学列举的这几个方法主要就是利用call和apply方法指定上下文的特性,实现类数组转数组的功能。

因为js语法中的提供的slice、concat和splice是数组原型对象上的方法,所以可以直接通过Array.prototype来访问。

以Array.prototype.slice.call(arguments)为例:

本来是Array.prototype调用的slice方法,由于通过call方法改变了slice方法上下文,所以可以理解为现在是由arguments调用slice方法,即arguments.slice(), 但slice方法属于数组的方法,只有数组才可以调用,所以在执行这句代码时,会自动将arguments转成一个真正的数组,至于具体是如何转的,这里涉及到js源码的底层原理,我们不用关心,只需要了解Array.prototype.slice.call(arguments)可以将类数组转成数组,剩余的两个方法也是相同的道理,可以将其作为一个特殊知识点,特殊记忆即可

祝学习愉快~

  • 提问者 weixin_慕丝2377090 #1

    老师还有个疑问,之前在数组那一节课中,slice、concat和splice这些方法是直接在数组实例上使用的,这里Array.prototype.slice.call,用数组的原型调用方法。首先这个不是很明白,因为之前课程中只教过用原型添加类的方法,而类或者构造函数的实例可以直接打点调用。

    其次这个Array.prototype.slice,最后也是变成了参数来调用slice方法。是不是就是对类数组对象进行了调用这个方法呢?如果是这样的话是不是可以直接用  目标要处理的类数组对象打点直接调用该方法更加方便吗?

    2021-04-17 11:55:41
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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