Почему ненадежно сравнивать свойство ".constructor" двух окон? - PullRequest
1 голос
/ 07 октября 2011

Я пытаюсь понять, почему следующее не работает так, как я думаю.Я хотел бы проверить, является ли объект окном.Я думал, что проверка конструкторов текущего окна и другого окна будет работать.

Итак, сначала создайте другое окно:

var popup = window.open('', '', '');

А затем проверьте с помощью:

popup.constructor === window.constructor;

Но по некоторым причинам результаты в разных браузерах различаются:

  • IE7: Возвращает true
    • Но это просто потому, что .constructor === undefined
  • IE8: возвращает false
  • IE9: выдает ошибку без текста ("")
  • Chrome: возвращает false
    • Хотя в обоих случаях.constructor === DOMWindow - но DOMWindow не доступен напрямую, как это
  • Опера: возвращает false
    • Хотя в обоих случаях .constructor === Object
  • Firefox: возвращает false
    • Хотя в обоих случаях .constructor === Window

Почему это не надежно и работает правильно?jQuery просто проверяет наличие "setInterval" in window, но я хотел бы создать более надежную функцию для проверки того, является ли объект окном.

1 Ответ

3 голосов
/ 07 октября 2011

Каждый отдельный window - это отдельный глобальный контекст для интерпретатора (и да, я пока игнорирую IE7). Ваша проблема действительно становится ясной, когда вы думаете о instanceof:

if (something instanceof Array) { ... }

Проблемы с этим возникают, когда «что-то» - это значение, которое было создано в отдельном контексте, например, в iframe. Каждое окно имеет свою собственную копию конструктора «Array», поэтому, даже если объект может быть экземпляром Array, он не является экземпляром той же функции конструктора.

Я подозреваю, что поведение IE7 связано с какой-то другой странностью, которую я думаю, что - это что-то вроде window.window, не равное window. Мол, один из них на самом деле является ссылкой на что-то внутреннее. (Может быть, window не равно window.self, хотя в остальном они ведут себя одинаково. Я не трачу много философского времени на размышления о IE7.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...