我们可以删除“getcontext”吗?属性的HTML5画布标签通过脚本

Can we delete the "getContext" property of HTML5 Canvas tag through script?

本文关键字:布标签 标签 脚本 HTML5 删除 getcontext 属性 我们      更新时间:2023-09-26

有一个HTML5一致性测试套件,其中包含对HTMLCanvasElement原型的测试。

此测试在Safari, Firefox上失败,但在Windows 7上通过Opera。

测试有一个脚本,试图删除HTMLCanvasElementgetContext属性,并进一步尝试读取getContext应给出undefined

delete window.HTMLCanvasElement.prototype.getContext;
_assertSame(window.HTMLCanvasElement.prototype.getContext, undefined, "window.HTMLCanvasElement.prototype.getContext", "undefined");

这个测试在WebKit (Safari)中失败,因为getContext属性有DontDelete属性,所以它不允许脚本删除这个属性。

在HTML5规范中是否有任何描述说删除getContext属性的脚本是有效的?

在HTML5规范中是否有任何描述说删除脚本的getContext属性是有效的?

没有,规范中没有明确说明。不知道为什么webkit不同于FF/Opera在这里(它是Chrome也不允许删除),但规范本身并不要求DontDelete对画布上的任何东西。ECMAScript规范中的其他内容可能会。

Firefox 7和8 alpha不会删除window.HTMLCanvasElement.prototype.getContext。它们只是返回true,但是getContext仍然在那里。换句话说,您链接到的测试在完全相同的位置和相同的原因失败。

Webkit当然允许你覆盖任何你想要的:window.HTMLCanvasElement.prototype.getContext = undefined

据我所知,getContext方法的可配置性(ES3中的[[DontDelete]], ES5中的[[Configurable]])在WebIDL中被描述为任何其他CanvasRenderingContext2D方法。

看一下"接口原型对象"节,它说:

对于定义的每个接口必须存在一个接口原型对象,无论该接口是否用[NoInterfaceObject]扩展属性声明。特定接口的接口原型对象具有与该接口上定义的属性和操作相对应的属性。这些属性将在下面的4.5.5和4.5.6节中进行更详细的描述。

在4.5.6中,你可以看到:

对于接口上定义的操作的每个唯一标识符,必须在接口原型对象(如果它是常规操作)或接口对象(如果它是静态操作)上有相应的属性,除非该标识符和操作的有效重载集并且参数计数为0(对于ECMAScript语言绑定)没有条目。

这种对应属性的特征如下:

属性的名称是标识符。

属性有属性{[[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}。

注意"[[可配置]]:true"