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

时间:2015-05-04 13:33:23

标签: javascript createjs

使用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);
};

2 个答案:

答案 0 :(得分:1)

.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

答案 1 :(得分:0)

所以,我找到了这个问题的答案,并希望跟进。在我解决这个问题的过程中,他们向Halcyon提供了疯狂的道具指导。该问题似乎是库CreateJS将这些函数映射到标准Javascript画布方法的方式的组合。因为它正在创建新对象,所以apply操作符在这个实例中不起作用。

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

长话短说,使用" new"无论你如何尝试设置上下文,operator,.apply()都不能作为一种方法将数组扩展为函数调用的一系列参数。