有一个针对HTMLCanvasElement原型的测试的HTML5 conformance test suite。
此测试在Safari和Firefox上失败,但在Windows7上通过Opera。
这个测试有一个脚本,它试图删除HTMLCanvasElement的getContext属性,并且进一步尝试读取getContext应该会得到undefined。
delete window.HTMLCanvasElement.prototype.getContext;
_assertSame(window.HTMLCanvasElement.prototype.getContext, undefined, "window.HTMLCanvasElement.prototype.getContext", "undefined");对于WebKit (Safari),此测试失败,因为getContext属性具有DontDelete属性,因此它不允许脚本删除此属性。
HTML5规范中有没有说明通过脚本删除getContext属性是有效的?
发布于 2011-10-03 13:23:57
据我所知,getContext方法的可配置性(在ES3中为[DontDelete],在ES5中为[可配置])在WebIDL中描述-就像任何其他CanvasRenderingContext2D方法一样。
看看"Interface Prototype Object"部分,它说:
对于定义的每个接口,无论该接口是否使用NoInterfaceObject
属性声明,都必须存在一个接口原型对象。特定接口的接口原型对象具有与该接口上定义的属性和操作相对应的属性。这些属性在下面的4.5.5和4.5.6节中有更详细的描述。
在4.5.6中,您可以看到:
对于接口上定义的操作的每个唯一标识符,接口原型对象(如果它是常规操作)或接口对象(如果它是静态操作)上必须有相应的属性,除非为该标识符和操作设置的有效重载以及参数计数为0(用于ECMAScript语言绑定)没有条目。
这种对应属性的特征如下:
属性的名称是标识符。
该属性具有属性{ [Writable]:true,[Enumerable]:true,[可配置]:true }。
注意“[可配置]:true”位(强调我的)。
发布于 2011-10-01 02:59:53
在HTML5规范中有没有说明通过脚本删除getContext属性是有效的?
不,规范中没有明确的说明。不知道为什么webkit与FF/Opera不同( Chrome也不允许删除),但规范本身并不要求画布上的任何东西都使用DontDelete。ECMAScript规范中的其他内容可能会这样做。
不过,Firefox7和8alpha不会删除window.HTMLCanvasElement.prototype.getContext。它们只是返回true,但getContext仍然在那里。换句话说,由于相同的原因,您链接到的测试在完全相同的位置失败。
当然,Webkit仍然允许您覆盖您想要的任何内容:window.HTMLCanvasElement.prototype.getContext = undefined
https://stackoverflow.com/questions/7614512
复制相似问题