我遇到了require.js的问题,可能还有Prototypal继承问题。这是我的模块:
define([], (function() {
"use strict";
var Player = function() {
console.log("Constructor of the Player Object");
this.audioObject = new Audio();
};
Player.prototype = new Audio();
return Player;
})); // define
然后我尝试以这种方式使用音频对象的播放方法:
define(["jquery", "player"], (function($, Player) {
"use strict";
/**
* The controls for the player
**/
var Controls = function(player) {
$(".play").click(function() {
console.log("play");
player.play();
});
};
return Controls;
})); // define
点击按钮时,Chrome会抛出错误: 未捕获的TypeError:非法调用
我现在已经尝试了几个小时,在这里阅读类似的问题,但大多数都与jQuery有关,我认为这里不是问题。 (我试图自己定义一个名为Player.prototype.play()的方法,并且工作正常,但我不认为这是重写所有方法的最佳方法)
答案 0 :(得分:0)
这可能是因为Audio
有一些隐藏的“幕后”属性,当实例化新Player
时,这些属性不会从原型中复制。
当您致电player.play()
时,play
期望在Audio
个实例上运行,但它正在Player
个实例上运行。从理论上讲,这里不应该存在问题,因为Player
应该与Audio
相同,因为它的原型是Audio
实例。但是,Audio
是主机对象,这意味着它不需要遵循普通JavaScript对象的规则。
那就是说,为什么你甚至为你的Audio
原型使用Player
个实例呢?除了容易出现奇怪的行为(正如你现在所观察到的)之外,由于你已经在Audio
属性中持有audioObject
对象,因此似乎完全没有必要。
我不完全了解您的设计,但为什么不使用audioObject
,例如,在此处拨打player.audioObject.play()
?