每个对象都应该有一个方法'addEventListener'吗?

时间:2011-10-08 19:48:04

标签: javascript oop

我需要一个函数来生成m和n之间的伪随机整数,所以我想,“我知道,我将使用randrange方法扩展Math,类似于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 个答案:

答案 0 :(得分:2)

为什么要将它附加到Math?如果你要去,Math.rand = ...有什么问题?

Math对象不应该以原型方式扩展,因为它是“静态”类型。您无法实例化它(即使用new调用它)。这是一个例外情况。所有其他类型都是“非静态的”。虽然这不应该令人惊讶,但Math只是静态方法的集合。不需要任何实例化。

Math.constructor === Object(至少在chrome中),所以你实际上扩展了每个对象的原型,并且可能是另一个库枚举了所有对象属性。例如:

Math.constructor.prototype.prop = 42;
k = {};
k.prop; // 42