有一个HTML5 conformance test suite测试HTMLCanvasElement
的原型。
此测试对于Safari,Firefox测试失败,但在Windows 7上为Opera传递。
测试有一个脚本,它试图删除getContext
的{{1}}属性,并进一步尝试阅读HTMLCanvasElement
应该给getContext
。
undefined
此测试对于WebKit(Safari)失败,因为delete window.HTMLCanvasElement.prototype.getContext;
_assertSame(window.HTMLCanvasElement.prototype.getContext, undefined, "window.HTMLCanvasElement.prototype.getContext", "undefined");
属性具有getContext
属性,因此它不允许脚本删除此属性。
HTML5规范中有没有说明脚本删除DontDelete
属性是否有效?
答案 0 :(得分:3)
HTML5规范中有没有说明脚本删除getContext属性有效?
不,规范中没有明确说明。不知道为什么webkit与FF / Opera不同(Chrome也是不允许删除),但规范本身并不要求DontDelete在Canvas上做任何事情。 ECMAScript规范中的其他内容可能会。
Firefox 7和8 alpha不会删除window.HTMLCanvasElement.prototype.getContext。它们只返回true,但getContext仍然存在。换句话说,您链接到的测试在完全相同的位置出于同样的原因失败。
Webkit当然仍然允许你覆盖你想要的任何内容:window.HTMLCanvasElement.prototype.getContext = undefined
答案 1 :(得分:2)
据我所知,getContext
方法的ES3中的[[DontDelete]],[[Configurable]]]中的{{DontDelete]]在WebIDL中描述 - 与任何其他CanvasRenderingContext2D
方法一样。 / p>
查看"Interface Prototype Object"部分,其中说明:
对于定义的每个接口,必须存在接口原型对象,无论接口是否使用[NoInterfaceObject]扩展属性声明。特定接口的接口原型对象具有与该接口上定义的属性和操作相对应的属性。这些属性在下面的4.5.5和4.5.6节中有更详细的描述。
在4.5.6中,您可以看到:
对于在接口上定义的操作的每个唯一标识符,接口原型对象(如果是常规操作)或接口对象(如果它是静态操作)必须有相应的属性,除非有效为该标识符和操作设置的重载,参数计数为0(对于ECMAScript语言绑定)没有条目。
这种相应属性的特征如下:
属性的名称是标识符。
属性具有{[[Writable]]:true,[[Enumerable]]:true, [[Configurable]]:true }。
注意“[[Configurable]]:true”位(强调我的)。