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

时间:2011-06-25 03:56:23

标签: javascript raphael

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

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

x.__proto__ === Raphael.el

以交叉浏览器的方式,但我不完全确定。

4 个答案:

答案 0 :(得分:4)

Pablo发布了一个不太正确的答案,但给了我寻找正确解决方案的灵感:

x.constructor.prototype == Raphael.el

答案 1 :(得分:3)

详细说明并添加一些更相关的信息(我花了一点时间才弄清楚接受的答案,我显然不是唯一一个看其他答案,而且,接受的答案仅适用于 Raphael对象的一种:它解决了原始问题,这是一个更完整的资源)。


检测拉斐尔元素

使用x.constructor.prototype == Raphael.el,您正在使用x,这个变量可能是Raphael 元素 (圈子,路径等 - 拉斐尔setpaper对象)并将构建它的函数的原型与拉斐尔本身的拉斐尔元素原型进行比较(拉斐尔是一个函数对象,el是一个定义的属性)。

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


检测拉斐尔集

如果您想测试某些内容是否是拉斐尔集合,则设置原型位于Raphael.st中,因此您可以使用以下方法测试变量是否为Raphael集:

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)。


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

以上都不适用于Raphael元素的子类型 - 例如如果您将圈子与R.rect().constructor.prototype进行比较,则会返回 true

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

someRectangle.type == "rect"

someCircle.type == "circle"

...等等。

答案 2 :(得分:1)

你不能使用constructor属性并检查创建对象的函数(我假设它被称为Raphael但我没有使用过lib。)

修改

检查了lib站点,你实际上是这样做的:

obj.constructor === Raphael //true

答案 3 :(得分:1)

我无法使用上述答案。但对我有用的是明确地与字符串"Raphaël’s object"进行比较。

例如:

var textName = paper.getElementByPoint(e.pageX, e.pageY);
if (textName== "Raphaël’s object")
{
   ...
}