语言中调用和应用方法的目的是什么?
这似乎是打破OOP原则的反模式的一个例子。或者它只是呈现多范式方法?
这个例子让我问这个问题。
在一个应用程序的位置(库的一部分)有这样的代码
public class move : MonoBehaviour
{
int loop = 0;
float[,] comp = new float[10,2];
public Vector3 speed;
void Start ()
{
speed = new Vector3(0,0.15f,0);
}
void Update ()
{
comp = spawner.score;
transform.Translate(speed);
if(transform.position.y < -2)
{
loop++;
Debug.Log("Loop:"+loop);
Destroy(gameObject);
}
}
}
在应用程序的另一部分(自编)中有这样一段代码
socket.emit = function() {
if (!socket.banned) {
emit.apply(socket, arguments)
}
}
首先,如果禁止该对象,则该对象不起作用。但是第二部分对图书馆逻辑一无所知并且独立工作。
如何解决这种情况?我们使用库来减轻最困难的部分。
答案 0 :(得分:3)
sameTo
仅用于一个目的,这是为了允许使用特定值Function.prototype.call
调用函数,即“{1}}”作为第一个参数传递。
this
是相同的,但附加的优点是,当调用函数时,作为第二个参数传递的数组被分割为多个参数。当你想调用一个带有可变大小参数列表的函数但是你在数组中准备好这些参数而不是单个值时,这很有用。
以Function.prototype.apply
为例。如果我有一组未知的大小,我希望找到最大的,有两种方法:
将每个元素与当前最大值进行比较,直到找到最大的
将所有这些内容直接传递给Math.max
。
我无法致电Math.max
因为我不知道有多少变量。相反,我可以致电Math.max(a, b, c, etc)
并将其扩展为Math.max.apply(null, myArray)
。
NB1:在ES6中Math.max(myArray[0], myArray[1], etc)
已不再严格要求,因为您可以.apply
使用.call
点差运算符,例如...
。
NB2:这与没有有关违反OOP原则。