在 CreateJS 方法 bezierCurveTo 上使用 .apply() 给出错误

Use of .apply() on CreateJS method bezierCurveTo gives error

我在使用 Function.prototype.apply() 中的 apply() 方法时遇到问题。

我正在尝试使用 apply() 将参数数组传递给 bezierCurveTo 方法,从而在我的 CreateJS 舞台上创建一系列绘图。这将使我能够遍历大约一百组这样的论点并绘制一幅完整的图画。

但是,apply() 不适用于 bezierCurveTo 方法(它适用于 moveTo 和 lineTo)。

相反,我得到

TypeError: this.append is not a function

有人知道为什么会发生这种情况吗?我不清楚为什么它适用于其他方法而不适用于 bezierCurveTo。

var myData = {
  curveTo: [214.1, 853.1, 327.1, 903.7, 451.8, 903.7],
};

var sha = new createjs.Shape();
sha.graphics.bezierCurveTo.apply(myData.curveTo);

谢谢。

编辑:

堆栈跟踪显示这是错误所在:

p.moveTo = function(x, y) {
    return this.append(new G.MoveTo(x,y), true);
};

.apply 的第一个参数是上下文,即。回调中 this 的值。

我认为正确的调用是:

sha.graphics.bezierCurveTo.apply(sha.graphics /* or maybe sha? */, myData.curveTo);

这相当于:

sha.graphic.berzierCurveTo(214.1, 853.1, 327.1, 903.7, 451.8, 903.7);

有关 .apply 的更多信息:

var obj = {
    "foo": "bar"
};
function get_foo() {
    return this.foo;
}
get_foo.apply(obj, []); // "bar" first argument becomes `this` in callback
get_foo.bind(obj)(); // "bar" .bind() returns a copy of the function with bound context

所以,我找到了这个问题的答案,想跟进。在我解决这个问题时,Halcyon 给予了他们耐心的指导。这个问题似乎是库 CreateJS 将这些函数映射到标准 Javascript canvas 方法的方式的组合。因为它正在创建新对象,所以 apply 运算符在这种情况下不起作用。

在此处阅读更多内容: Use of .apply() with 'new' operator. Is this possible?

长话短说,当使用 "new" 运算符时,无论您如何尝试设置,.apply() 都无法将数组扩展为函数调用中的一系列参数上下文。