我有一个现有的原型链:
{ 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__
,我不想改变两个原始原型链中的任何一个,因为它们可能会在别处使用的
答案 0 :(得分:3)
注意:我还没有完整的解决方案,但在概述中我相信你必须:
从原型链的顶部开始,对于“类型”,使用Object.getOwnPropertyNames()
查找属性,并使用Object.getOwnPropertyDescriptor()
中的每个属性。
使用Object.getPrototypeOf
获取__proto__
字段以查找链中的下一个类型。
我认为你需要递归地执行上述操作,直到你到达Object.prototype
。
然后,递归备份链,使用Object.create
创建一个新对象,该对象与原始原型共享相同的属性,但是具有不同的prototype
对象(可以是您的对象) '试图插入链中或前一遍的结果)。
编辑我的尝试是http://jsfiddle.net/alnitak/xkX5v。它使用ES5方法安全地尝试确保不可枚举的属性保持不变,并且getter和setter按预期工作。
我可以看到某些缺陷,但尚未尝试解决,例如1.新创建的类型没有构造函数2.没有办法调用添加到原型链等的函数的构造函数。