在语言中调用和应用方法的目的是什么?
这似乎是违反OOP原则的反模式的一个例子。还是说它只是呈现了多范式的方法?
这个例子让我提出了这个问题。
在应用程序的一个地方(库的一部分)存在这样的代码。
socket.emit = function() {
if (!socket.banned) {
emit.apply(socket, arguments)
}
}在应用程序的另一部分(自写的)中,有这样一段代码。
socket.emit = function(arguments){
data = Array.prototype.slice.call(arguments);
emit.apply(socket, data);
}首先,如果禁止该对象,则该对象不应该工作。但第二部分对图书馆逻辑一无所知,独立工作。
如何解决这种情况?我们使用库来缓解最困难的部分。
发布于 2017-10-11 20:41:52
Function.prototype.call的存在只有一个目的,这是为了允许使用特定的this值调用函数,即作为第一个参数传递的函数。
Function.prototype.apply也是一样的,但是在调用函数时,作为第二个参数传递的数组被拆分成多个参数。当您想要调用一个函数,该函数接受一个变量大小的参数列表,但是在数组中准备好了这些参数,而不是作为单独的值,这是非常有用的。
以Math.max为例。如果我有一组未知的大小,并且我希望找到最大的一组,有两种方法:
Math.max。我不能调用Math.max(a, b, c, etc),因为我不知道有多少变量。相反,我可以调用Math.max.apply(null, myArray),然后将其扩展到Math.max(myArray[0], myArray[1], etc)。
NB1:在ES6中,.apply不再是严格要求的了,因为您可以将.call与...扩展运算符一起使用,例如Math.max.call(null, ...myArray)。
NB2:这与破坏OOP原则无关。
https://stackoverflow.com/questions/46697083
复制相似问题