如何检查某个对象是否为Raphael对象?

7

如何检查JavaScript对象是否为Raphael对象(不是画布,而是圆形、路径等)?

Raphael.el代表通用元素原型;我认为我想进行测试。

x.__proto__ === Raphael.el

在跨浏览器环境下,但我并不完全确定。

4个回答

4

Pablo发布了一个不完全正确的答案,但是给了我灵感去找到正确的解决方案:

x.constructor.prototype == Raphael.el

4
稍微详细一些,添加一些相关信息(我花了一点时间才弄明白被接受的答案,显然我不是唯一一个看到其他答案的人,另外,被接受的答案只适用于 Raphael 对象中的 一种类型:它解决了最初的问题,这是更完整的资源)。

检测 Raphael 元素

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

这个方法可以工作。但它也无法找到基于与 Raphael.el 不同的原型的 Raphael 对象,例如 set 和 paper 对象:


检测 Raphael 集合

如果你想测试某个东西是否为 Raphael 集合,set 原型在 Raphael.st 中,所以你可以使用以下命令来测试变量是否是 Raphael 集合:

someSet.constructor.prototype == Raphael.st


检测 Raphael 纸张对象

至于检测 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 中定义的元素原型制作的。 对于这些,Raphael 使其更容易:

someRectangle.type == "rect"

someCircle.type == "circle"

...等等。


1
不知道是否是新的,但像集合这样的元素现在有了类型属性。您可以执行yourSet.type == "set"。 - adriendenat
我们应该使用“===”而不是“==”吗? - F Lekschas

1

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

例如:

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

很棒的小工具函数,paper.getElementByPoint。谢谢! - seebiscuit

1

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

编辑

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

obj.constructor === Raphael //true


不幸的是,这实际上不起作用。它检查obj是否是绘图画布的引用,而不是我想要的在画布上的东西。 - Sophie Alpert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接