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