Добавить новые контексты в объекты canvas

Я создаю библиотеку в javascript, и мне хотелось узнать, есть ли способ добавить новый тип контекста к холсту, а не к 2d

var ctx.document.getElementById('canvas').getContext("othercontext");

где я бы создал другойконтекст со всеми нормальными свойствами 2d, плюс еще несколько. Есть ли способ сделать это?

Ответы

Ответ 1

Вы не можете сделать это точно, но вы можете подключить метод getContext и вернуть расширенный 2D-контекст, который имеет дополнительные свойства и методы:

(function() {
    // save the old getContext function
    var oldGetContext = HTMLCanvasElement.prototype.getContext;

    // overwrite getContext with our new function
    HTMLCanvasElement.prototype.getContext = function(name) {
        // if the canvas type requested is "othercontext",
        // augment the 2d canvas before returning it
        if(name === "othercontext") {
            var plainContext = oldGetContext.call(this, "2d");
            return augment2dContext(plainContext);
        } else {
            // get the original result of getContext
            return oldGetContext.apply(this, arguments);
        }
    }

    // add methods to the context object
    function augment2dContext(inputContext) {
        inputContext.drawSmileyFace = function() { /* ... */ };
        inputContext.drawRandomLine = function() { /* ... */ };
        inputContext.eraseStuff = function() { /* ... */ };
        return inputContext;
    }
})();

Таким образом, вызов someCanvas.getContext("othercontext").drawSmileyFace() будет вызывать drawSmileyFace, который был добавлен к обычному возвращаемому значению 2D-контекста getContext("2d").

Однако я не решаюсь предложить использовать этот шаблон в фактическом развернутом коде, потому что:

  • Ваше имя контекста позднее может быть реализовано браузерами, а перезапись getContext предотвратит доступ к этому типу контекста.
  • В более общем плане обычно плохая практика для расширения функциональности объектов хоста, таких как элементы DOM, поскольку объекты-хосты могут (но обычно этого не делать) бросать ошибки на совершенно обычные операции, такие как доступ к свойствам

Ответ 2

Пока я не смог выкопать все, что окончательно ответит на ваш вопрос, я бы предположительно заявил, что маловероятно, что вы сможете определить новый контекст еще в любых реализациях Javascript (и даже если бы вы могли, браузеры, вероятно, не поддерживали бы его некоторое время). Вы могли бы, однако, изменить уже существующие "2d" контексты с дополнительными свойствами, возможно, запустив их через конструктор?

Ответ 3

Я уверен, что это невозможно. Я предлагаю обернуть его в объект или добавить методы в контекст

Ответ 4

Простой ответ: нет, это невозможно.

Контекст Canvas предназначен для создания браузеров (Chrome, Firefox и т.д.), а не авторов JavaScript/Canvas (вы и я).

Помимо "2d" и "webgl", спецификация canvas указывает, что поставщики браузеров могут определять свои собственные (экспериментальные) контексты (например, "moz-3d" ), но опять же, а не авторы JavaScript.

Придерживайтесь добавления новых методов в существующий контекст. (Или создание обертки и т.д.)