Object.create和内置对象

时间:2010-11-10 21:41:08

标签: javascript object-create

我正在尝试向内置对象添加功能(新方法)(在我的例子中,类型为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上失败,但在Firefox 4 Beta和Chrome 7上取得成功。

另一个例子:Object.create(new Date()).getDate()在所有浏览器中都失败了。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

CanvasRenderingContext2D对象是主机对象,这意味着一个对象不是JavaScript语言的一部分,而是一个由环境提供的对象。主机对象有一些特殊的规则:它们基本上可以做任何他们喜欢的事情,并且没有义务像本机JavaScript对象那样表现。大多数浏览器使其主机对象的行为与本机对象类似; IE通常不会(请参阅this recent question获取IE主机对象的示例)。

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

Object.create(new Date()).getDate()情况不同:问题在于getDate()方法的实现依赖于它所调用的对象的内部时间属性,它无法访问,因为该特定属性是没有继承原型链。有关更详细的说明,请参阅this discussion

答案 1 :(得分:0)

使用对象聚合可能对此有所帮助。创建另一个包含要扩展的类的对象的类,向其中添加新方法,然后......这里是悲伤部分,将所有方法调用映射到内部对象。

如果只有this是标准:(