gpt4 book ai didi

javascript - this.apply 方法,以 this 作为参数

转载 作者:行者123 更新时间:2023-12-03 08:20:26 24 4
gpt4 key购买 nike

在Douglas Crockford的The Good Parts一书中,他是这样实现数组push方法的:

Array.prototype.push = function ( ) {
this.splice.apply(
this,
[ this.length, 0 ].
concat(Array.prototype.slice.apply(arguments))
);
return this.length;
};

不明白th​​is.method_name.apply是如何工作的,以自身(this)作为参数,在代码中对应于this.splice.apply;如果我使用 Array.prototype.splice.apply ,我不会得到正确的结果。

希望有人能解释一下 this.splice.apply(this,parameters)Array.prototype.splice.apply(this,parameters) 之间的区别

最佳答案

简短回答:this.splice.applyArray.prototype.splice 是相同的函数。 “唯一”的区别是使用该函数的上下文。 this.splice 使用数组的实例作为 this 的值,而 Array.prototype.splice 使用 Array.prototype 作为 this 的值,这就是为什么在后一种情况下您需要使用 .apply 调用它。这样,您就可以告诉函数在运行时使用什么作为this

丑陋的事实:在函数定义中 this 并不引用对象 Array.prototype,而是 this 引用该对象(在本例中是一个数组),它是 Array实例。因为该对象是 Array 的实例,意味着它继承了 Array.prototype 上定义的所有属性。 Array.prototype.slice 是在 Array.prototype 上定义的,因此它是对象的实例方法,因此您可以使用 this.slice 调用它>。当您以这种方式调用 slice 时,this 引用您的对象,它又是一个数组。当您使用 Array.prototype.slice 引用切片时,this 在此上下文中引用 Array.prototype,这就是您需要调用的原因它与 .apply(arguments) 一起表示“运行此函数并使用 this=arguments”。

关于javascript - this.apply 方法,以 this 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33768810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com