2015-11-03 3 views
3

Я заметил, что CanvasRenderingContext2D.createLinearGradient находится на прототипе CanvasRenderingContext2D.Почему CanvasRenderingContext2D.createLinearGradient() не является статической функцией?

Это означает, что рекомендуется создавать градиенты (наряду с несколькими другими ресурсами) в контексте, на котором они предназначены.

Однако, я могу создать ресурс на холсте и использовать его на другом холсте:

const ctx1 = document.getElementById('canv1').getContext('2d'); 
const ctx2 = document.getElementById('canv2').getContext('2d'); 

const grad = ctx1.createLinearGradient(0, 0, 100, 100); 
grad.addColorStop(0, 'white'); 
grad.addColorStop(1, 'black'); 

ctx2.fillStyle = grad; 
ctx2.fillRect(0, 0, 100, 100); 

Есть ли причины для этого, кроме предположительно ресурсов управления временем жизни за кулисами?

Спасибо!

ответ

2

Удивляет, что этот вопрос не был закрыт, так как единственные ответы субъективны, кроме следующего абзаца.

Глядя через WHATWG HTML Living Standard нет заявленной причины для расположения createLinearGradient или других объектов, созданных для использования только с CanvasRenderingContext2D (2D контекст) объект/интерфейсом, за исключением требования, что эти методы являются обязательной частью интерфейс.

Остальная часть моего ответа субъективна.

Градиенты не требуют 2D-контекста и не содержат ссылки на холст или 2D-контекст. Эффективно позволяет полностью удалить их (холст & 2D-контекст), готовый к удалению GC. Это предполагает, что нет никакого управления ресурсами в отношении градиентов, происходящих за кулисами.

Причина его местоположения (на мой взгляд) была бы простой, что без 2D-контекста нет необходимости в градиенте. Можно представить себе сценарии, в которых есть потребность в объектах, связанных с стилем, до того, как будет создан какой-либо 2D-контекст, но для этого невозможно исключить непреодолимую проблему, так как без контекста 2D градиент не используется, а прокси-объект может удовлетворять требованиям внутреннего пространства.

Хотя я бы подумал, что созданный объект градиента может быть интерфейсом SVG.linearGradient, как в случае с CanvasRenderingContext2D.currentTransform как интерфейс SVG.matrix. Таким образом, обеспечивается возможность совместного использования ресурсов между SVG и 2D контекстом. Было бы разумно сделать это, поскольку они связаны между собой.

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

+0

Возможно, это позволяет скрывать в контексте кэширование ресурсов в контексте? Учитывая, что WeakMap теперь вещь, это может быть относительно простая оптимизация для браузеров. В любом случае, я просто буду рассматривать их как простые структуры данных, которые я могу свободно перемещать, и у GC есть дело с очисткой. –

Смежные вопросы