Модернизр и Видео.h264
Я смотрю, как Modernizr обнаруживает поддержку видео и H.264, но это не имеет никакого смысла для меня. не bool
примитивный логический? почему он становится булевым объектом? Почему bool.h264 волшебным образом начинает вообще иметь смысл? Спасибо
tests['video'] = function() {
var elem = document.createElement('video'),
bool = false;
// IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224
try {
if ( bool = !!elem.canPlayType ) {
bool = new Boolean(bool);
bool.ogg = elem.canPlayType('video/ogg; codecs="theora"') .replace(/^no$/,'');
// Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546
bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,'');
bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,'');
}
} catch(e) { }
return bool;
};
2 ответа
Я на самом деле написал большую часть этого теста.
Это просто формат, который Modernizr использует для обнаружения с подзначениями. В JavaScript все является объектом, и новый Boolean также.
Первоначально bool
действительно является примитивным логическим значением, к которому нельзя добавить свойства. После if
условие, значение bool
перезаписывается с помощью new Boolean(bool)
, В Javascript вызов new для функции создает пустой объект и использует функцию в качестве конструктора для указанного объекта. В случае с Boolean()
Конструктор, единственное заметное дополнение к объекту, является valueOf()
функция, которая возвращает исходное примитивное значение. В противном случае у вас теперь есть обычный объект, к которому могут быть добавлены произвольные свойства.