如何使用javascript获取所有类型的子类型?

时间:2016-02-23 11:23:14

标签: javascript

我有一个 A类 和一个 B类扩展A 我需要找到所有的B类和其他扩展A的类。

1 个答案:

答案 0 :(得分:2)

这有两个方面:

  1. 有一个要检查的类(构造函数)列表

  2. 进行检查

  3. 没有任何内置的东西可以为你做#1,你必须自己做。通过class创建的函数不会作为属性添加到全局对象中。

    一旦你有了这个列表,就可以#2,因为class锁定了它创建的函数的prototype属性(你不能用别的东西替换它),你可以建立与instanceofObject.getPrototypeOf的关系:

    if (B.prototype instanceof A) {
        // B extends A, directly or indirectly
    }
    
    if (Object.getPrototypeOf(B.prototype) === A.prototype) {
        // B extends A directly
    }
    

    使用旧的ES5语法并不一定可靠,因为正常函数上的prototype不是只读。

    直播示例: (需要支持class的浏览器)

    
    
    "use strict";
    class A {
    }
    class B extends A {
    }
    class C { // Unrelated
    }
    
    snippet.log("B.prototype instanceof A? " + (B.prototype instanceof A));
    snippet.log("Object.getPrototypeOf(B.prototype) === A.prototype? " + (Object.getPrototypeOf(B.prototype) === A.prototype));
    
    snippet.log("C.prototype instanceof A? " + (C.prototype instanceof A));
    snippet.log("Object.getPrototypeOf(C.prototype) === A.prototype? " + (Object.getPrototypeOf(C.prototype) === A.prototype));
    
    <!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
    <script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
    &#13;
    &#13;
    &#13;