首页 > 解决方案 > 如何找到两个对象最近的共同祖先类?

问题描述

这个问题基本上相当于 JavaScript如何找到两个非接口类的最近公共超类

TL;DR:给定两个对象和一个广泛的继承设置,我怎样才能找到它们最近的公共类?


假设程序中有几个相关的类,它们的层次结构如下:

在此处输入图像描述

class A {}

class B extends A {}

class C extends B {}

class D extends B {}

class E extends D {}

给定对 的实例C和 的实例的E引用,我想获得对 的引用B,因为这是它们最接近的共同祖先。

function getClosestCommonAncestorClass(c: C, e: E): typeof B;

链接到 TypeScript 游乐场

我怎么做?

标签: javascriptoopinheritance

解决方案


这是一个树问题(最低共同祖先),其中边由 确定Object.getPrototypeOf

这个想法是从根节点获取两个给定节点的路径,然后比较从根节点开始的这两个路径中的条目。最后一个相同的节点是公共节点。最后得到那个原型对象的构造函数,也就是“类”:

function getPath(o) {
    const path = [];

    while (o) {
        path.push(o);
        o = Object.getPrototypeOf(o);
    }

    return path.reverse();
}

function getClosestCommonAncestorClass(x, y) {
    const xPath = getPath(x);
    const yPath = getPath(y);
    const steps = Math.min(xPath.length, yPath.length);

    let i = 0;

    for (; i < steps; i++) {
        if (xPath[i] !== yPath[i]) break;
    }

    return xPath[i - 1]?.constructor;
}

class A {}
class B extends A {}
class C extends B {}
class D extends B {}
class E extends D {}

console.log(getClosestCommonAncestorClass(new C(), new E())); // class B


推荐阅读