有没有一种方法可以获取所有扩展JavaScript原型的对象

有没有一种方法可以获取所有扩展JavaScript原型的对象,javascript,Javascript,我一直在寻找一种方法来获取用Javascript实现特定原型的所有对象 我试图实现的是在运行时自动发现可用的内容。我有一个基本的原型,我们称之为“Widget”,我打算扩展它来制作各种类型的Widget。我发现有几个网站在讨论如何实现Java风格,我计划用它来动态地引入各种小部件的功能。我缺少的一点是能够说“给我小部件的所有东西” 对于show-and-tell部分,这就是我定义“小部件”的方式 以及小部件的扩展: MyWidget = function(document) { Widget

我一直在寻找一种方法来获取用Javascript实现特定原型的所有对象

我试图实现的是在运行时自动发现可用的内容。我有一个基本的原型,我们称之为“Widget”,我打算扩展它来制作各种类型的Widget。我发现有几个网站在讨论如何实现Java风格,我计划用它来动态地引入各种小部件的功能。我缺少的一点是能够说“给我
小部件的所有东西”

对于show-and-tell部分,这就是我定义“小部件”的方式

以及小部件的扩展:

MyWidget = function(document) {
  Widget.apply(this,arguments);
  this.type = "MyWidget";
  // Custom stuff here
};
MyWidget.prototype = Object.create(Widget.prototype, {
  // MyWidget's prototype extensions
});
MyWidget.prototype.constructor = MyWidget;
诸如此类:

var ClassSystem = {

    subClasses: [],

    getByBaseClass: function (baseClass) {
        return this.subClasses.filter(function (subClass) {
            return (subClass.prototype instanceof baseClass);
        });
    },

    extend: function (subClass, baseClass, config) {
        subClass.prototype = Object.create(baseClass.prototype, config || {});
        subClass.prototype.constructor = subClass;
        this.subClasses.push(subClass);
        return subClass;
    }

};
用法:

// Base Class
function Widget() {}
Widget.prototype.sayHello = function () {
  console.log('hello');
};

// Sub Class
function MyWidget() {}

// Inherit
ClassSystem.extend(MyWidget, Widget)

console.log(ClassSystem.getByBaseClass(Widget).length) // Will output 1
console.log(ClassSystem.getByBaseClass(Widget)) // Will output [MyWidget()]

这只是一个非常简单的版本,您可以根据需要进行扩展。

创建一个工厂来创建实例,使您能够跟踪所有创建的实例?您是在寻找由
new…()
创建的实例,还是只寻找具有特定原型的构造函数?@dsuckau只寻找具有特定原型的构造函数。基本上,我想创建一个可插入的对象,我可以在运行时读取所有子对象。你可以创建一个简单的继承函数,你自己的“类系统”,它接收一个基本原型、新的构造函数和原型的扩展。该函数将使用
Object.create()
等执行第二个代码示例“小部件的扩展”。。但是你也可以在那里保存一些全局继承信息/注册表,关于哪个构造函数有哪个原型等等。这可能会有帮助,我希望有一个更内置的解决方案,但这会很好。谢谢
// Base Class
function Widget() {}
Widget.prototype.sayHello = function () {
  console.log('hello');
};

// Sub Class
function MyWidget() {}

// Inherit
ClassSystem.extend(MyWidget, Widget)

console.log(ClassSystem.getByBaseClass(Widget).length) // Will output 1
console.log(ClassSystem.getByBaseClass(Widget)) // Will output [MyWidget()]