gpt4 book ai didi

javascript - Object.create 和内置对象

转载 作者:行者123 更新时间:2023-11-29 20:20:33 25 4
gpt4 key购买 nike

我正在尝试向内置对象(在我的例子中,类型为 CanvasRenderingContext2D)添加功能(新方法)。

第一种方法是将方法添加到原型(prototype)中,它有效,但我不希望修改内置对象。

我正在考虑使用 Object.create(来自 ES5)来扩展对象,比如 Object.create(context, <my_method_descriptors>) ,但是在某些浏览器上访问扩展对象的属性/调用方法时会失败。例如,这个片段


var canvas = document.getElementById("mainCanvas");<br/>
var context = canvas.getContext('2d');<br/>
var exContext = Object.create(context);<br/>
try {<br/>
exContext.fillStyle = 'red';<br/>
exContext.fillRect(0, 0, 120, 120);<br/>
} catch (e) {<br/>
alert(e);<br/>
}

在 IE9 Beta 和 Safari 5 上会失败,但在 Firefox 4 Beta 和 Chrome 7 上会成功。

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

有什么想法吗?

最佳答案

CanvasRenderingContext2D 对象是一个宿主对象,这意味着该对象不是 JavaScript 语言的一部分,而是环境提供的对象。宿主对象有一些特殊的规则:它们基本上可以做任何他们喜欢的事情,并且不必像原生 JavaScript 对象那样表现得像任何方式。大多数浏览器使它们的宿主对象的行为大体上与 native 对象相似; IE 通常不会(请参阅 this recent question 了解 IE 主机对象古怪的示例)。

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

Object.create(new Date()).getDate() 的情况不同:问题在于 getDate() 方法的实现依赖于它所调用的对象的内部时间属性,它无法访问该属性,因为该特定属性不是沿原型(prototype)链继承的。参见 this discussion以获得更详细的解释。

关于javascript - Object.create 和内置对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4149358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com