如何检查是否有拉斐尔物体?

Sop*_*ert 7 javascript raphael

给定一个JavaScript对象,我如何检查它是否是Raphael对象(不是纸张,而是圆形,路径等)?

Raphael.el代表通用元素原型; 我想我想测试一下

x.__proto__ === Raphael.el
Run Code Online (Sandbox Code Playgroud)

以跨浏览器的方式,但我不完全确定.

use*_*ca8 4

详细说明一下并添加一些更相关的信息(我花了一点时间才找出接受的答案,而且我显然不是独自查看其他答案,而且,接受的答案仅适用于一种类型的拉斐尔对象:它解决了原来的问题,这是一个更完整的资源)。


检测拉斐尔元素

使用x.constructor.prototype == Raphael.el,您正在获取可能是 Raphael元素(圆、路径等 -不是Raphael或对象)x的变量,并将构造它的函数的原型与 Raphael 本身中的 Raphael 元素的原型进行比较(Raphael 是一个函数对象,el是它的定义属性)。setpaper

这是可行的,但它也不会找到基于与 Raphael.el 不同原型的 raphael 对象,例如集合和纸对象:


检测拉斐尔集

如果您想测试某个东西是否是拉斐尔集,Raphael.st可以使用集合原型来测试变量是否是拉斐尔集:

someSet.constructor.prototype == Raphael.st


检测拉斐尔纸质物体

至于嗅探 Raphael对象的等效项,因为它们是使用Raphael()函数创建的,所以您可以使用:

paper.constructor.prototype == Raphael.prototype


以上三者基本相同...

someSet.constructor.prototype == paper.circle().constructor.prototype

...或者...

someSet.constructor.prototype == paper.set().constructor.prototype

...或者...

someSet.constructor.prototype == Raphael().constructor.prototype

...但没有实际运行这些函数,因此避免了浪费处理(并避免 Raphael() 抱怨它尚未传递 ID)。


检测对象的子类型(例如矩形、圆形...)

以上都不适用于拉斐尔元素的子类型 - 例如,如果将圆与 进行比较R.rect().constructor.prototype,它将返回true

这是因为圆形和矩形都是使用中定义的元素Raphael.el原型制作的。然而,对于这些,拉斐尔让事情变得简单:

someRectangle.type == "rect"

someCircle.type == "circle"

...ETC..