2012-03-06 8 views
6

Estaba tratando de entender lo que podía de las funciones de animación de jQuery, pero terminé corriendo en todo tipo de funciones internas que no entendía, y al final aterrizó en isWindow. El código de isWindow comprueba si un objeto tiene la propiedad setInterval y devuelve falso en caso contrario.jQuery's .isWindow method?

Por supuesto, cualquier objeto podría tener la propiedad setInterval sin ser la ventana, y aunque casi tendría que ser un intento deliberado de sabotear la funcionalidad de jQuery para tener un objeto con ese nombre de propiedad exacto, puedo imaginar algunos casos razonables donde podría ser involuntario.

¿No hay una mejor manera de comprobar si un objeto es una ventana? ¿No podían usar algo en la línea de

obj.setInterval && obj.setInterval.toString() == 'function setIternval(){ [native code] } 

Sé el regreso de toString de una función interna no va a ser estándar en todos los navegadores, pero los escritores de jQuery parecen tener una gran comprensión de estas diferencias entre navegadores También sé que esto tampoco es un método infalible, ya que alguien podría anular fácilmente el método toString para devolver esa misma cadena, pero esto evitaría el problema de tener un objeto confundido con una ventana.

No te lo pediría si pensaba que isWindow fue utilizado solamente en los objetos internos de jQuery, pero era parte de isPlainObject, que se utiliza en .extend, que puede ser utilizado en los objetos externos.

+0

"Por supuesto, cualquier objeto podría tener el setInterval propiedad sin ser la ventana" . ¿Cómo te imaginas? – j08691

+0

@ j08691, ¿Cómo no sabes cómo me imagino? – mowwwalker

+0

Lo que digo es que setInterval es una función de ventana JavaScript central, ¿cómo puede tenerlo ningún objeto? No tiene sentido para mí. – j08691

Respuesta

3

¿Qué pasa:

function isWindow(obj) { 
    var toString = Object.prototype.toString.call(obj); 
    return toString == '[object global]' || toString == '[object Window]' || toString == '[object DOMWindow]'; 
} 

parece funcionar en Chrome, Firefox, Opera, Internet Explorer y Safari (versiones más nuevas)

+0

+1 Porque es mejor que usar toString en la función setInterval, aunque todavía se puede engañar fácilmente anulando el método 'Object.prototype.toString'. – WTK

+0

Sí, aún mejor. Me pregunto por qué no usan esto. – mowwwalker

+0

Versión más compacta :) 'función isWindow (obj) { return ['[object global]', '[object Window]', '[object DOMWindow]']. IndexOf (Object.prototype.toString.call (obj))> = 0} ' – WTK