有没有办法获得在JavaScript中扩展原型的所有对象

时间:2015-04-20 13:05:15

标签: javascript

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

我想要完成的是自动发现运行时可用的内容。我有一个基础Prototype,我们称之为“Widget”,我打算扩展它以制作各种类型的Widgets。我发现有几个站点讨论如何实现Java-esque Reflections API in JavaScript,我曾计划使用它来动态地提取各种Widgets的功能。我遗失的那篇文章是能够说“给我所有Widget”的东西

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

Widget = function(document) {
  if (document) {
    this._type = document.type;
    this._value = document.value;
  }
};
Widget.prototype = {
  get type() {
    return this._type;
  },
  get value() {
    return this._value;
  },
  set value(value) {
    this._value = value;
  },
  get someCustomWidgetMethod() {
    // Do something Widget-ish
  }
};

Widget的扩展名:

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;

1 个答案:

答案 0 :(得分:2)

类似的东西:

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()]

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