为什么CanvasRenderingContext2D.createLinearGradient()不是静态函数?

问题描述:

我注意到,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); 

有什么理由比其他资源可能在幕后生命周期管理?

谢谢!

令人惊讶的是,这个问题还没有被封闭,因为唯一的答案是主观的,除了下面的段落。

通过WHATWG HTML Living Standard寻找存在用于createLinearGradient的位置或使用仅与CanvasRenderingContext2D(2D上下文)的对象/接口创建的其他对象没有陈述的原因,除了要求,即这些方法的必需部分接口。

我的答案的其余部分是主观的。

渐变不需要2D上下文,也不会持有对画布或2D上下文的引用。有效地允许一个完全删除它们(帆布& 2D上下文)准备好由GC处置。这表明没有资源管理与幕后发生的梯度有关。

它的位置(在我看来)的原因很简单,没有2D上下文就不需要渐变。我们可以想象在创建任何2D上下文之前需要与样式相关的对象的场景,但是没有这种情况会导致无法解决的问题,因为没有上下文2D,梯度不可用,并且代理对象可以满足入侵要求。

尽管我会认为创建的渐变对象可能是SVG.linearGradient接口,而接口CanvasRenderingContext2D.currentTransform的接口是CanvasRenderingContext2D.currentTransform。从而赋予在SVG和2D环境之间共享资源的能力。因为它们是相关的,所以这样做是有道理的。

该标准要求2D环境支持这些方法,因此在其他地方实现它们将是多余的。

+0

也许它允许在实现中隐藏资源的每上下文缓存?鉴于WeakMap现在是一件事情,它可能是浏览器实现相对容易的优化。无论如何,我只是将它们视为简单的数据结构,我可以*地传递,并让GC处理清理。 –