Должен ли каждый объект иметь метод addEventListener? - PullRequest
1 голос
/ 08 октября 2011

Мне нужна была функция для генерации псевдослучайного целого числа между m и n, и поэтому я подумал: «Я знаю, я расширю Math методом randrange, похожим на метод Python».

Math.constructor.prototype.rand = function rand(min, max) {
    return min + Math.floor(Math.random() * (max + 1 - min));
};

Кажется, это работает, но когда я поместил его в свой интегрированный код, у меня возникло несколько проблем с сообщениями об ошибках, таких как "[эта функция] не имеет метода addEventListener '".

Суть моего вопроса заключается в следующем: есть ли что-то принципиально неправильное в том, как я расширил Math здесь? Должна ли эта функция иметь такой метод, а если нет, почему jwplayer запрашивает его?

Ниже я привел гораздо больше подробностей, но если вам уже скучно и вы хотите начать постулировать ответы, вы можете пропустить остальные.


Когда я пошел тестировать интегрированный код, я увидел эту ошибку:

jwplayer.js:1 Uncaught TypeError: Object function rand(min, max) {
        return min + Math.floor(Math.random() * (max + 1 - min));
    } has no method 'addEventListener'
jwplayer.js:1 a.plugins.pluginloader.load
jwplayer.js:1 a.embed
jwplayer.js:1 b.api.setup
script.js:155 (anonymous function)
jquery-1.6.4.js:660 jQuery.extend.each
jquery-1.6.4.js:274 jQuery.fn.jQuery.each
script.js:150 jQuery.click.window.Modernizr.input.required
jquery-1.6.4.js:1016 jQuery.extend._Deferred.deferred.resolveWith
jquery-1.6.4.js:437 jQuery.extend.ready
jquery-1.6.4.js:923 DOMContentLoaded

Вот фрагмент из script.js, на который ссылается выше:

// Setup the video player:
$("video").each(function (i, e) {
    // Switching out ids like this is a horrible hack,
    // but apparently it's the only way jwplayer will load.
    var oldId = $(e).attr('id');
    $(e).attr("id", "tmpVideoSetup");
    jwplayer("tmpVideoSetup").setup({
        flashplayer: window.CDN + "/js/libs/mediaplayer-5.7-licensed/player.swf",
        levels: [
            // TODO: set this up to dynamically choose the videos to play.
            { file: window.CDN + "/videos/LK_About.mp4" },
            { file: window.CDN + "/videos/LK_About.wmv" }
        ]
    });
    $(e).attr("id", oldId);
});

Когда я удаляю код загрузки видео, все остальное ведет себя как ожидалось.

1 Ответ

2 голосов
/ 09 октября 2011

Зачем вообще прикреплять его к Math? И если вы собираетесь, что не так с Math.rand = ...?

Объект Math не должен быть расширен прототипным способом, потому что это «статический» тип. Вы не можете создать его экземпляр (то есть назвать его с new). Это исключительный случай. Все остальные типы являются «нестатичными». Хотя это не должно удивлять, Math - это просто набор статических методов. Нет необходимости в какой-либо реализации.

Math.constructor === Object (по крайней мере, в Chrome), так что вы фактически расширяете прототип каждого объекта, и, вероятно, другая библиотека перечисляет все свойства объекта. Например:

Math.constructor.prototype.prop = 42;
k = {};
k.prop; // 42
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...