在幕后发生的事情是,当
.slice()通常被调用时,它
this是一个数组,然后它仅在该数组上进行迭代并完成其工作。
如何
this在
.slice()功能的阵列?因为当您这样做:
object.method();
…该
object自动成为价值
this的
method()。因此:
[1,2,3].slice()
…将
[1,2,3]Array设置为
thisin 的值
.slice()。
但是,如果您可以用其他东西代替
this价值呢?只要您替换的内容具有数字
.length属性,以及一堆作为数字索引的属性,它就应该起作用。这种类型的对象通常称为类数组对象。
该
.call()和
.apply()方法让你手动设置的值
this的函数。因此,如果我们的值设置
this在
.slice()一个阵列状物体 ,
.slice()只会认为它的工作与Array,并会做它的东西。
以这个简单的对象为例。
var my_object = { '0': 'zero', '1': 'one', '2': 'two', '3': 'three', '4': 'four', length: 5};
显然这不是一个Array,但是如果您可以将其设置为的
this值
.slice(),那么它将正常工作,因为它看起来像Array一样
.slice()可以正常工作。
var sliced = Array.prototype.slice.call( my_object, 3 );
如您在控制台中看到的,结果就是我们所期望的:
['three','four'];
因此,当您将
arguments对象设置为的
this值时,就会发生这种情况
.slice()。因为
arguments具有一个
.length属性和一堆数字索引,所以
.slice()就像在真正的数组上工作一样进行工作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)