首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Object.create和内置对象

Object.create和内置对象
EN

Stack Overflow用户
提问于 2010-11-10 21:41:07
回答 2查看 307关注 0票数 2

我试图将功能(新方法)添加到内置对象(在我的例子中,是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()在所有浏览器中都失败了。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-10 23:13:24

CanvasRenderingContext2D对象是宿主对象,意思是一个对象,它不是JavaScript语言的一部分,而是由环境提供的对象。宿主对象有一些特殊的规则:它们本质上可以做他们喜欢做的任何事情,并且没有义务以任何方式像本机JavaScript对象那样运行。大多数浏览器使其宿主对象的行为大体上类似于本机对象;IE一般不这样做(关于IE主机对象的一个示例,请参见这个最近的问题 )。

这样做的结果是,您不应该依赖主机对象来像本机对象那样运行。他们没有义务也经常没有义务,就像在这种情况下一样。我建议创建一个包装器对象。

Object.create(new Date()).getDate()的情况不同:存在的问题是,getDate()方法的实现依赖于它被调用的对象的内部时间属性,它无法访问该对象,因为该特定属性不是沿着原型链继承的。有关更详细的解释,请参见这一讨论

票数 3
EN

Stack Overflow用户

发布于 2010-11-10 22:41:54

也许在这里使用对象聚合可能会有所帮助。创建另一个包含要扩展的类的对象的类,向它添加新的方法-- and...here来了可悲的部分,将所有的方法调用映射到内部对象。

如果是一个标准的话:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4149358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档