为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

无国 2019-04-05 19:09:19
<!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

查看完整描述

2 回答

?
番茄乌梅

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

查看完整回答
反对 回复 2019-06-12
?
风起临冬

这是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不要首字母大写,只有构造函数的首字母才大写

查看完整回答
反对 回复 2019-04-16

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信