给定一个JavaScript对象,我如何检查它是否是Raphael对象(不是纸张,而是圆圈,路径等)?
Raphael.el
代表通用元素原型;我想我想测试
x.__proto__ === Raphael.el
以交叉浏览器的方式,但我不完全确定。
答案 0 :(得分:4)
Pablo发布了一个不太正确的答案,但给了我寻找正确解决方案的灵感:
x.constructor.prototype == Raphael.el
答案 1 :(得分:3)
详细说明并添加一些更相关的信息(我花了一点时间才弄清楚接受的答案,我显然不是唯一一个看其他答案,而且,接受的答案仅适用于 Raphael对象的一种:它解决了原始问题,这是一个更完整的资源)。
使用x.constructor.prototype == Raphael.el
,您正在使用x
,这个变量可能是Raphael 元素 (圈子,路径等 - 不拉斐尔set
或paper
对象)并将构建它的函数的原型与拉斐尔本身的拉斐尔元素原型进行比较(拉斐尔是一个函数对象,el是一个定义的属性)。
这样可行,但它也不会找到基于Raphael.el不同原型的raphael对象,比如集合和纸质对象:
如果您想测试某些内容是否是拉斐尔集合,则设置原型位于Raphael.st
中,因此您可以使用以下方法测试变量是否为Raphael集:
someSet.constructor.prototype == Raphael.st
至于嗅探拉斐尔纸张对象的等价物,因为它们是使用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")
{
...
}