Недавно я столкнулся с некоторыми проблемами с IE8 (я не знаю о 9 на данный момент) с чтением и сравнением значений некоторых свойств [[Class]]. Фактически это только в случае для объекта localStorage.
Я использую такой метод
var ToStr = Object.prototype.toString;
Object.type = function _type( obj ) {
var res = ToStr.call( obj ).split( ' ' )[ 1 ].replace( ']', '' );
if( obj === window ) {
res = 'Window';
}
else if( res === 'Window' || res === 'Global' ) {
res = 'Undefined';
}
else if( res.indexOf( 'HTML' ) === 0 ) {
res = 'Node';
}
return ( res );
};
Этот метод вернет эти значения, например:
var foo = { },
bar = [ ],
num = 52,
win = window;
Object.type( foo ) === 'Object'; // true
Object.type( bar ) === 'Array'; // true
Object.type( num ) === 'Number'; // true
Object.type( win ) === 'Window'; // true
Это работает, конечно, во всех браузерах, о которых я знаю, просто проверяя это свойство [[Class]] на самом объекте. Теперь я вызываю этот метод для объекта localStorage
Object.type( win.localStorage ) === 'Storage' // true (not in IE8)
IE8 просто возвращает Object здесь. Однако это не проблема с актуалом, проблема возникает, когда вы пытаетесь сравнить объект localStorage с объектом window. Как вы можете видеть, я проверяю, является ли переданный аргумент текущим объектом window
if( obj === window ) { }
Если obj теперь является объектом window.localStorage, это закончится ошибкой
"Class does not support automation"
Это происходит, если вы попытаетесь сравнить localStorage с window, вы можете сравнить его со всем остальным без каких-либо проблем. Это просто еще одна ошибка или я могу как-то решить эту проблему?
Я думаю, в основном мой вопрос:
Как вы знаете в IE8 (возможно, IE9 тоже), если вы имеете дело с объектом localStorage?
Последнее, что я хочу сделать, - это внутреннее обертывание всего метода с помощью try-catch, потому что он называется довольно часто.
Чтобы полностью запутать меня здесь: Когда вы делаете console.log( obj ) в консоли IE8, он возвращает вас [object Storage] (nice!), но если вы вызываете Object.prototype.toString.call( obj ), он возвращает [object Object]. То же самое касается typeof obj, вернет Object.
Второй вопрос:
Как IE8 console распечатывает правильный [[Class]]?