Как я могу проверить, является ли что-то объектом Рафаэля? - PullRequest
7 голосов
/ 25 июня 2011

Учитывая объект JavaScript, как я могу проверить, является ли он объектом Рафаэля (не бумага, а круг, путь и т. Д.)?

Raphael.el представляет прототип универсального элемента;Я думаю, что хочу протестировать

x.__proto__ === Raphael.el

в кросс-браузерном режиме, но я не совсем уверен.

Ответы [ 4 ]

4 голосов
/ 25 июня 2011

Пабло опубликовал ответ, который был не совсем правильным, но вдохновил меня на поиск правильного решения:

x.constructor.prototype == Raphael.el
3 голосов
/ 17 декабря 2012

Чтобы немного проработать и добавить более важную информацию (мне потребовалось немного времени, чтобы выяснить принятый ответ, и я явно не одинок, просматривая другие ответы, также, принятый ответ работает только для один тип объекта Рафаэля: он решает исходный вопрос, это более полный ресурс).


Обнаружение элементов Рафаэля

Используя x.constructor.prototype == Raphael.el, вывзяв x, переменную, которая может быть элементом Raphael (круг, путь и т. д. - не объект Raphael set или paper) иСравнение прототипа функции, которая его построила, с прототипом элементов Raphael в самом Raphael (Raphael - объект функции, el - определенное свойство).

Это работает, но также не найдетобъекты Рафаэля, основанные на различных прототипах Raphael.el, такие как наборы и бумажные объекты:


Обнаружение наборов Рафаэля

Если вы хотите проверить, является ли что-то набором Рафаэля, наборПрототип находится в Raphael.st, поэтому вы можете проверить, является ли переменная набором Рафаэля, используя:

someSet.constructor.prototype == Raphael.st


Обнаружение бумажных объектов Рафаэля

Что касаетсяэквивалент для прослушивания объектов Raphael paper , поскольку они создаются с помощью функции 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.

Это связано с тем, что круги и прямоугольники сделаны с использованием прототипа element , определенного в Raphael.el.Однако Рафаэль делает это легко:

someRectangle.type == "rect"

someCircle.type == "circle"

... и т. Д.

1 голос
/ 14 декабря 2012

Я не смог использовать упомянутый ответ.Но для меня сработало явное сравнение со строкой "Raphaël’s object".

Например:

var textName = paper.getElementByPoint(e.pageX, e.pageY);
if (textName== "Raphaël’s object")
{
   ...
}
1 голос
/ 25 июня 2011

Разве вы не можете использовать свойство constructor и проверить функцию, которая создала объект (я предполагаю, что он называется Raphael, но я не использовал библиотеку).

Редактировать

Проверил сайт lib, вы действительно делаете это так:

obj.constructor === Raphael //true

...