我需要一个函数来生成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);
});
当我删除视频加载代码时,其他所有内容都按预期运行。
答案 0 :(得分:2)
为什么要将它附加到Math
?如果你要去,Math.rand = ...
有什么问题?
Math
对象不应该以原型方式扩展,因为它是“静态”类型。您无法实例化它(即使用new
调用它)。这是一个例外情况。所有其他类型都是“非静态的”。虽然这不应该令人惊讶,但Math
只是静态方法的集合。不需要任何实例化。
Math.constructor === Object
(至少在chrome中),所以你实际上扩展了每个对象的原型,并且可能是另一个库枚举了所有对象属性。例如:
Math.constructor.prototype.prop = 42;
k = {};
k.prop; // 42