工作中遇见了一个这样的需求:网页预览视频文件(格式有两种mp4与wmv)时,mp4格式的采用浏览器自带的video标签进行播放,wmv格式的由于浏览器不支持直接播放,则需要调用定制的wmvH5播放器来播放。
经调研发现wmvH5播放器实际上也是采用video标签进行播放的,只不过是加载、播放、暂停、定位播放等核心功能进行了特殊定制,其他如音量控制、播放状态等都是video自带的。
为了减少冗余代码,统一调用接口,我首先想到的是JS的对象继承、方法覆写,可没能实现。后来通过翻阅MDN的JavaScript参考文档发现了两个反射内置对象Proxy与Reflect,完美解决我现在遇见的问题。两个内置对象的使用在文档中阐述的已经很详细,这里不再累述。仅此记录提出问题、解决问题的过程。
参考文档
代码片段
video = document.getElementsByTagName('video')[0]; MyVideo = new Proxy(video, { get : function(target, name) { console.log(name); console.log(typeof target[name]) if ('function' == typeof target[name]) {//当是function时需要二次代理 return new Proxy(target[name], { apply : function(target, thisArg, argumentsList) { console.log("called: " + argumentsList.join(", ")); return target.apply(video, argumentsList); } }); } else { return target[name]; } }, set : function(target, property, value) { target[property] = value; return value; } });
时间: 2024-12-27 09:55:06