猿问
下载APP

调用引入的js闭包函数 报错 is not a constructor

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-1.12.4.js"></script>
    <script src="2.js"></script>
    <script src="1.js"></script>
</head>
<body>
<audio src=""></audio>
</body>
</html>

闭包 即2.js 创建一个函数的原型对象init函数

(function (window) {
    function Player($audio) {
      return new Player.prototype.init($audio);
    }
    window.Player = Player;
})(window);

调用 即 1.js 闭包创建 对象 

$(function () {
    var $audio = $("audio");
    var Player = new Player($audio);
})

为何创建的 player 报错:Uncaught TypeError: Player is not a constructor

无国
浏览 444回答 2
2回答

番茄乌梅

因为你没有定义 Player.prototype.init 函数

风起临冬

这是jqurey的什么特殊写法吗?原谅我不怎么喜欢用jquery,我通过js来分析一下。因为你的Player并不是构造函数,实例化当然会出错。你要想把Player作为构造函数,并且添加Player的原型方法,应该这样写function Player() {} Player.prototype.init = function () {   ...... }又或者,你确定没写错的话,你的代码中 return new Player.prototype.init($audio) 说明了init是一个构造函数,而且已经在Player的原型对象里。但是这样的话,Player()返回的就是一个init的实例,不可能是构造函数。所以你的new Player()自然报错。如果init像我猜的那样确实是一个构造函数,并且已经被jQuery默认添加进Function的原型对象里,那么你应该var player = Player()这样写,典型的工厂模式,可以方便的生成init实例。还有变量player不要首字母大写,只有构造函数的首字母才大写
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答