使用require.js在JavaScript中继承:非法调用

时间:2013-04-05 19:46:03

标签: javascript google-chrome inheritance requirejs

我遇到了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()的方法,并且工作正常,但我不认为这是重写所有方法的最佳方法)

1 个答案:

答案 0 :(得分:0)

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

当您致电player.play()时,play期望在Audio个实例上运行,但它正在Player个实例上运行。从理论上讲,这里不应该存在问题,因为Player应该与Audio相同,因为它的原型是Audio实例。但是,Audio主机对象,这意味着它不需要遵循普通JavaScript对象的规则。

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

我不完全了解您的设计,但为什么不使用audioObject,例如,在此处拨打player.audioObject.play()