Прежде всего, обязательное предупреждение против изменения хост-объектов .
Теперь, когда вы знаете, во что ввязываетесь, вот проблема с вашим фрагментом:
Новая функция, назначенная CanvasRenderingContext2D.prototype.lineTo
, вызывает старую функцию просто как a(b, c)
. Когда функция вызывается так - a(b, c)
- также известная как «вызывается как функция», она выполняется с this
глобальным объектом.
Поэтому context.lineTo(10, 15)
теперь будет выполнять старую функцию lineTo
(с псевдонимом a
), где this
будет глобальным объектом, а не context
. Когда lineTo
не имеет возможности работать с context
, он, очевидно, мало что может сделать, поэтому возникает ошибка.
Как это исправить?
Ну, мы можем вызвать функцию с правильным this
значением:
CanvasRenderingContext2D.prototype.lineTo = function(a) {
return function(b,c) {
a.call(this, b, c);
return this;
};
}(CanvasRenderingContext2D.prototype.lineTo);
Обратите внимание a.call(this, b, c)
, который вызывает a
функцию с правильным this
.