0

我遇到了 require.js 和原型继承的问题。这是我的模块:

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 会抛出 Error: Uncaught TypeError: Illegal invocation

我已经尝试了几个小时,在这里阅读了类似的问题,但其中大多数与 jQuery 有关,我认为这不是问题所在。(我尝试自己定义一个名为 Player.prototype.play() 的方法,效果很好,但我认为这不是重写所有方法的最佳方法)

4

1 回答 1

0

这可能是因为在实例化Audionew 时,有一些隐藏的“幕后”属性不会从原型中复制。Player

当您调用时player.play()play期望在Audio实例上运行,但它正在Player实例上运行。理论上,这里应该没有问题,因为Player应该和 an 一样Audio,因为它的原型是一个Audio实例。但是,Audio它是一个宿主对象,这意味着它不需要遵循普通 JavaScript 对象的规则。

也就是说,你为什么还要为你的原型使用Audio实例呢?Player除了容易出现奇怪的行为(正如您现在所观察到的)之外,这似乎完全没有必要,因为您已经Audio在属性中持有一个对象audioObject

我不完全理解你的设计,但为什么不使用audioObject,例如,调用player.audioObject.play()这里呢?

于 2013-04-05T20:31:35.077 回答