我有一个现有的原型链:
{ 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____,也不想改变两个原始原型链中的任何一个,因为它们可能在其他地方使用。
发布于 2014-01-22 14:54:34
注:我还没有完全的解决办法,但在大纲上,我认为你必须:
从原型链的顶部开始,对于“类型”,使用Object.getOwnPropertyNames()查找属性,并对每个属性使用Object.getOwnPropertyDescriptor()。
使用Object.getPrototypeOf获取__proto__字段以查找链中的下一个类型。
我认为您需要递归地执行上述操作,直到您到达Object.prototype为止。
然后,递归回链,使用Object.create创建一个新对象,该对象与原始原型共享相同的属性,但具有不同的prototype对象(即您试图在链中插入的对象或上一次传递的结果)。
编辑我的尝试是在http://jsfiddle.net/alnitak/xkX5v。它使用ES5方法来安全地尝试确保不可枚举属性保持不变,并且getter和setter按预期工作。
我看到了一些缺陷,但没有尝试解决,例如: 1.新创建的类型没有构造函数。2.无法调用添加到原型链中的函数的构造函数,等等。
https://stackoverflow.com/questions/21285741
复制相似问题