我试图将功能(新方法)添加到内置对象(在我的例子中,是CanvasRenderingContext2D类型)中。
第一种方法是将方法添加到原型中,它可以工作,但我不希望修改内置对象。
我考虑使用Object.create (来自ES5)扩展对象,类似于Object.create(context, <my_method_descriptors>),但是在某些浏览器上访问扩展对象上的属性/调用方法时会失败。例如,这个片段
`var canvas = document.getElementById("mainCanvas");`
var context = canvas.getContext('2d');var exContext = Object.create(context);try {exContext.fillStyle = 'red';exContext.fillRect(0, 0, 120, 120);} catch (e) {alert(e);}
在IE9 Beta和Safari 5上会失败,但在Firefox4Beta和Chrome7上会成功。
另一个例子:Object.create(new Date()).getDate()在所有浏览器中都失败了。
有什么想法吗?
发布于 2010-11-10 23:13:24
CanvasRenderingContext2D对象是宿主对象,意思是一个对象,它不是JavaScript语言的一部分,而是由环境提供的对象。宿主对象有一些特殊的规则:它们本质上可以做他们喜欢做的任何事情,并且没有义务以任何方式像本机JavaScript对象那样运行。大多数浏览器使其宿主对象的行为大体上类似于本机对象;IE一般不这样做(关于IE主机对象的一个示例,请参见这个最近的问题 )。
这样做的结果是,您不应该依赖主机对象来像本机对象那样运行。他们没有义务也经常没有义务,就像在这种情况下一样。我建议创建一个包装器对象。
Object.create(new Date()).getDate()的情况不同:存在的问题是,getDate()方法的实现依赖于它被调用的对象的内部时间属性,它无法访问该对象,因为该特定属性不是沿着原型链继承的。有关更详细的解释,请参见这一讨论。
发布于 2010-11-10 22:41:54
也许在这里使用对象聚合可能会有所帮助。创建另一个包含要扩展的类的对象的类,向它添加新的方法-- and...here来了可悲的部分,将所有的方法调用映射到内部对象。
如果这是一个标准的话:
https://stackoverflow.com/questions/4149358
复制相似问题