如何在没有TypeError:非法调用的情况下代理媒体流对象



我最近试图用javascript代理一个MediaStream对象,注意到我可以,但出现了一个错误。我使用了以下代码。


function createChangeableStream(stream) {
stream["_stream_"]=stream;
return new Proxy(stream,{
set: function(obj, prop, value){
if(prop==="_stream_")
obj._stream_=value;
else
obj._stream_[prop]=value;
},
get: function(obj, prop) {
if(prop==="_stream_")
return obj._stream_;
else
return obj._stream_[prop];
}
});
}

因为我无法改变目标。。。我使用了上面的变通方法。每次我尝试给MediaStream.getTracks()打电话,我都会得到TypeError: Illegal invocation,我会感谢你的帮助。该函数适用于任何其他对象。并且通过修改CCD_ 3属性来改变"target"。我也意识到这个

let x=new Proxy(stream,{});
x.getTracks()

不起作用。

对于任何有类似问题的人来说,我用以下代码成功地避免了错误。

function createChangeableStream(stream) {
stream["_stream_"]=stream;
stream["_call_handler_"]=function (obj,prop,args) {
return obj[prop](...args);
}
return new Proxy(stream,{
set: function(obj, prop, value){
if(prop==="_stream_")
obj._stream_=value;
else
obj._stream_[prop]=value;
},
get: function(obj, prop) {
if(prop==="_stream_")
return obj._stream_;
else if((typeof obj._stream_[prop])==="function"){
return function () {
return obj._call_handler_(obj._stream_,prop,[...arguments]);
} 
}else
return obj._stream_[prop];
}
});
}

但是我仍然不知道为什么这个错误一开始就存在。也许是个虫子,我不知道。

相关内容

  • 没有找到相关文章

最新更新