学习记录ES6反射内置对象Proxy与Reflect

工作中遇见了一个这样的需求:网页预览视频文件(格式有两种mp4与wmv)时,mp4格式的采用浏览器自带的video标签进行播放,wmv格式的由于浏览器不支持直接播放,则需要调用定制的wmvH5播放器来播放。

经调研发现wmvH5播放器实际上也是采用video标签进行播放的,只不过是加载、播放、暂停、定位播放等核心功能进行了特殊定制,其他如音量控制、播放状态等都是video自带的。

为了减少冗余代码,统一调用接口,我首先想到的是JS的对象继承、方法覆写,可没能实现。后来通过翻阅MDN的JavaScript参考文档发现了两个反射内置对象Proxy与Reflect,完美解决我现在遇见的问题。两个内置对象的使用在文档中阐述的已经很详细,这里不再累述。仅此记录提出问题、解决问题的过程。

参考文档

  • JavaScript参考文档
  • Reflect
  • Proxy

代码片段


		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;
			}
		});

你可能感兴趣的:(学习记录ES6反射内置对象Proxy与Reflect)