利用ECMAScript 5 Object.getPrototypeOf实现对象方法重发机制

作者:异步漫步时间:2026-10-25 08:31:21浏览:446

本文介绍如何利用ECMAScript 5新增的Object.getPrototypeOf方法,绕过类型信息直接获取对象原型,从而构建一个名为resend的方法。该机制允许在对象内部重新调用原型链上的方法,实现了类似事件重发或方法重调的功能,适用于需要动态调整方法调用链的场景。

利用Object.getPrototypeOf构建resend机制

ECMAScript 5规范定义了一个备受期待的方法:Object.getPrototypeOf。该方法能够忽略类型信息,直接获取指定对象的[[prototype]](原型)。基于这一特性,我们可以构建出一个名为resend的功能:(请使用Chrome 5或IE9预览第三版浏览器进行测试验证)


resend方法代码实现

具体实现代码如下:

 
obj.resend = function() {
var pof = Object.getPrototypeOf;
var has = function() {......} // 封装hasOwnProperty方法
var make = function(obj, old) {
return function(name, args) {
var step = pof(obj),
r;
while (step && !has(step, name)) step = pof(step);
if (!step) throw new Error('Unable to resend: method missing');
var foundMethod = step[name];
var backup = arguments.callee;
this.resend = make(this, backup);
r = foundMethod.apply(this, Array.prototype.slice.call(arguments, 1));
this.resend = old;
return r
} 
}; 
return function(name, args__) {
var rv;
var old = this.resend;
this.resend = make(this, old);
rv = this.resend.apply(this, arguments);
this.resend = original;
return rv;
} 
}()
作者最新文章