JavaScript代理对象无法正常工作

时间:2016-05-07 18:27:01

标签: javascript firefox

Firefox中的JavaScript代理对象似乎不适用于网络音频对象。

例如:

audio = new AudioContext();
s = audio.createOscillator();
s0 = new Proxy (s, {});
s0.connect(audio.destination);
s0.start();

上面的代码应该将s0上的所有操作转发给s。但是,我得到的错误如下:

  

" TypeError:' start'调用了一个没有实现接口OscillatorNode的对象。"

我已搜索过有关此内容的任何信息,但未发现任何相关信息。这是一个已知的错误/限制吗?这些对象是否因某些明确的原因而无法代理?

感谢您提供任何相关信息。

- 富

1 个答案:

答案 0 :(得分:1)

问题在于,当您在代理上调用方法时,该方法将接收代理作为this值,而不是基础对象。

function Constructor() {}
Constructor.prototype.method = function() {
  return this;
};
var obj = new Constructor(),
    proxy = new Proxy(obj, {});
obj.method(); // obj
proxy.method(); // proxy

在这种情况下,您的AudioContext实例是一个非标准对象,因此实现可以在其上存储实现定义的内部数据,可用于了解它是否为AudioContext 。由于代理对象只重定向必要的内部方法,因此可以检测到它不是AudioContext实例。

如果您确实需要使用代理包装器,可以尝试添加get陷阱:

var audio = new AudioContext(),
    s = audio.createOscillator();
s0 = new Proxy (s, {
  get: function(target, property, receiver) {
    var val = target[property];
    if(typeof val !== 'function') return val;
    return function(...args) {
      var thisVal = this === receiver ? target : this; /* Unwrap the proxy */
      return Reflect.apply(val, thisVal, args);
    }
  }
});
s0.connect(audio.destination);
s0.start();