合并两个原型链

时间:2014-01-22 14:32:43

标签: javascript inheritance

我有一个现有的原型链:

{ name: 'layer2' } <- { name: 'layer1' }

。我希望能够在不同的原型链之上“重新绑定”这个链,让我们说:Element.prototype。这可能吗?

var layer1 = { name: 'layer1' };
var proto = Object.create(one);

proto.name = 'layer2';

// prototype chain: layer2 <- layer1 <- Object

var ElementProto = Element.prototype;

// desired prototype chain: layer2 <- layer1 <- ElementProto <- Object

注意: 我不想使用__proto__,我不想改变两个原始原型链中的任何一个,因为它们可能会在别处使用

1 个答案:

答案 0 :(得分:3)

注意:我还没有完整的解决方案,但在概述中我相信你必须:

从原型链的顶部开始,对于“类型”,使用Object.getOwnPropertyNames()查找属性,并使用Object.getOwnPropertyDescriptor()中的每个属性。

使用Object.getPrototypeOf获取__proto__字段以查找链中的下一个类型。

我认为你需要递归地执行上述操作,直到你到达Object.prototype

然后,递归备份链,使用Object.create创建一个新对象,该对象与原始原型共享相同的属性,但是具有不同的prototype对象(可以是您的对象) '试图插入链中或前一遍的结果)。

编辑我的尝试是http://jsfiddle.net/alnitak/xkX5v。它使用ES5方法安全地尝试确保不可枚举的属性保持不变,并且getter和setter按预期工作。

我可以看到某些缺陷,但尚未尝试解决,例如1.新创建的类型没有构造函数2.没有办法调用添加到原型链等的函数的构造函数。