Недопустимый вызов Javascript - что дать в качестве контекста функциям CanvasRenderingContext2D.prototype

1

Поэтому в основном я хочу скопировать функции CanvasRenderingContext2D.prototype и сохранить их в разных переменных. И отлично, я делаю:

var c = CanvasRenderingContext2D.prototype;
var moveTo = c.moveTo;

и после пары попыток избежать незаконного вызова

moveTo(100, 100); // illegal invocation

moveTo.call($('canvas').getContext('2d'), 100, 100) /* 
^ which actually doesn't give any error
but doesn't seem to work in all cases either. I guess
I can't take any other context than the original one
*/

moveTo.call(CanvasRenderingContext2D, 100, 100) // illegal invocation

moveTo.call(CanvasRenderingContext2D.prototype, 100, 100) // illegal

moveTo.call(CanvasRenderingContext2D.constructor (tried what I can) // illegal

moveTo.call(anything else, 100, 100) // bet what this time

(function() {
    moveTo(100, 100);
})(); // failed too

но все способы решения необходимого контекста для меня потерпели неудачу.

Я хочу сохранить эти функции, потому что мне нужно переписать исходные функции, чтобы выполнить некоторые вычисления, а затем фактически увидеть что-то, что мне нужно для выполнения сохраненных функций. Я много читал о недопустимых вызовах, здесь о переполнении стека, а также о других веб-сайтах, и я вполне понимаю проблему - мне нужен исходный контекст, чтобы в функции были переменные и т.д.

// if we have

var a = something.run();

// then we can't do a(), because 'something' is lost, illegal invocation

Вот как я это понимаю, и я надеюсь, что я не ошибаюсь.

В основном, что я должен поместить в контекст, если все терпит неудачу? Я понятия не имею, каким может быть оригинальный контекст. Кстати, пожалуйста, не кричите на меня, если я не вижу здесь очевидных вещей или не знаю, что контекст - это бла-бла-бла.

Теги:
html5-canvas

1 ответ

0

Я хочу сохранить эти функции, потому что мне нужно переписать исходные функции, чтобы выполнить некоторые вычисления, а затем фактически увидеть что-то, что мне нужно для выполнения сохраненных функций.

Я полагаю, вы ищете следующее:

// keep track of the original function
var originalMoveTo = CanvasRenderingContext2D.prototype.moveTo;

// override
CanvasRenderingContext2D.prototype.moveTo = function(...args) {
  // specific behavior
  console.log(...args);
  // call the original (your choice)
  originalMoveTo.apply(this, [...args]);
}

Когда вы хотите вернуться к нормальной жизни:

CanvasRenderingContext2D.prototype.moveTo = originalMoveTo;
  • 0
    Спасибо, это работает. Теперь я понимаю, как я должен был это сделать.
  • 0
    Это ответ на ваш вопрос, однако вы должны знать, что переопределение нативных методов считается плохой практикой (быстрый поиск в Google покажет вам, почему).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню