Поэтому в основном я хочу скопировать функции 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
Вот как я это понимаю, и я надеюсь, что я не ошибаюсь.
В основном, что я должен поместить в контекст, если все терпит неудачу? Я понятия не имею, каким может быть оригинальный контекст. Кстати, пожалуйста, не кричите на меня, если я не вижу здесь очевидных вещей или не знаю, что контекст - это бла-бла-бла.
Я хочу сохранить эти функции, потому что мне нужно переписать исходные функции, чтобы выполнить некоторые вычисления, а затем фактически увидеть что-то, что мне нужно для выполнения сохраненных функций.
Я полагаю, вы ищете следующее:
// 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;