Firefox中的JavaScript代理对象似乎不适用于网络音频对象。
例如:
audio = new AudioContext();
s = audio.createOscillator();
s0 = new Proxy (s, {});
s0.connect(audio.destination);
s0.start();
上面的代码应该将s0上的所有操作转发给s。但是,我得到的错误如下:
" TypeError:' start'调用了一个没有实现接口OscillatorNode的对象。"
我已搜索过有关此内容的任何信息,但未发现任何相关信息。这是一个已知的错误/限制吗?这些对象是否因某些明确的原因而无法代理?
感谢您提供任何相关信息。
- 富
答案 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();