Модернизр и Видео.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() функция, которая возвращает исходное примитивное значение. В противном случае у вас теперь есть обычный объект, к которому могут быть добавлены произвольные свойства.

Смотрите здесь и здесь.

Другие вопросы по тегам