【发布时间】:2016-09-25 20:03:20
【问题描述】:
我有一个现有的原型层次结构,我想修改它以保持层次结构不变,但在其末尾添加了一个额外的原型。 instanceof 应该为所有原型返回 true。
即:假设我有 B->A,我想让它成为 B->A->Base。现在instanceof 应该为 A、B、Base 返回 true。
我尝试使用 B.prototype.prototype 和 Object.setPrototypeOf(),但在这两种情况下都没有运气。
Object.setPrototypeOf() 示例:
class A {
do() { console.log("do A"); }
}
class B extends A {
do() { console.log("do B"); }
doB() { console.log("what"); }
}
var a = new A();
var b = new B();
a.do();
b.do();
b.doB();
console.log(a instanceof A) // true
console.log(a instanceof B) // false
console.log(b instanceof A) // true
console.log(b instanceof B) // true
class Base {
doBase() { console.log("this is the base!"); }
}
// now add Base to B's chain, so that B -> A -> Base
// TODO: doesn't work!
Object.setPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(B)), Base.prototype)
//Object.setPrototypeOf(Object.getPrototypeOf(B), Base)
console.log(Object.getPrototypeOf(B))
console.log(Object.getPrototypeOf(Object.getPrototypeOf(B)))
var c = new B();
console.log(c instanceof B) // true
console.log(c instanceof A) // true
console.log(c instanceof Base) // false (!!! how to fix it?)
c.doBase(); // crash, not a function
【问题讨论】:
-
这看起来很疯狂。你为什么想这么做?为什么不直接创建
Base的实例并使其成为B的子类?这就是 OO 的意义所在。 -
"我想修改它以使层次结构保持不变" - 这是不可能的。
A原本继承自Object,现在应该继承自Base?这不是“完整的”。 -
是的,确实很疯狂。而不是我的选择。我正在尝试修复一个较旧的框架,以便可以将它与 ES6 类一起使用。所述框架使用 Component 基类扩展所有用户组件,但这样做是通过覆盖原型然后将所有原始属性复制回其中来实现的。所以它现在看起来像是继承自 Component,从而失去了原来的类。然后我不能再实例化它了,因为 babel 生成了一个
_classCallCheck现在失败了。 -
@Bergi:是的,完全正确。仅在之后应该是 Base 的最终对象之前保持完整。也许将其视为链中的插入,Object 仍然会在最后。
-
@MiB 其实我的意思是你应该暴露框架的
Component类,这样你就可以写class A extends myframework.Component并且框架不需要再覆盖任何原型了
标签: javascript inheritance prototypal-inheritance