繁体   English   中英

JavaScript代理对象不起作用

[英]JavaScript proxy objects don't work

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

例如:

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

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

“ TypeError:'start'在未实现接口OscillatorNode的对象上调用。”

我已经搜索了有关此信息,但没有找到任何相关信息。 这是已知的错误/限制吗? 这些对象是否由于某些明确的原因而不是可代理的?

感谢您提供任何信息。

-丰富

问题是,当您在代理服务器上调用方法时,该方法将接收代理服务器作为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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM