Недавно я столкнулся с некоторыми проблемами с 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]]
?