【问题标题】:Dynamically Generating Custom Classes动态生成自定义类
【发布时间】:2018-09-25 02:04:07
【问题描述】:

我现在正在编写一个应用程序,它要求用户能够从预定义的对象列表中选择一个对象类型,或者通过前端系统生成一个新的同级对象类型。所以它看起来像下面这个例子

`
    class predefinedClass extends someParentClass{
        ...
    }

    //Some user defined class
    class dynamicClass extends someParentClass{
        ...
    }

`

那么有人有生成动态类的经验吗?我有一种预感,函数式方法可能比 OOP 方法更容易,但我认为值得一试。

【问题讨论】:

  • 你总是可以使用文本生成然后 eval.. 但我怀疑使用类生成可以完成的任何事情都可以使用对象原型更容易地完成。期待答案,好问题。
  • 所以我实际上使用了文本生成。你们中的任何人说的都没有错,我实际上在此过程中学到了一些东西,但是通过适当的表单控件,我可以在运行时生成一个动态类,然后创建一个静态类供以后使用。

标签: javascript


【解决方案1】:

所以回答我的问题需要一点背景知识。所以我有 4 个不同的基类,在这种情况下,我们就称它们为 A、B、C、D 类。这些类经过测试并证明可以工作。然后我把这些类转换成 JSON 格式,像这样被反对。

A 类

 {
        "props": {
            "name": "Default Name",
            "type": "A"
        },
        "functions": [
            {
                "name": "hello",
                "params": [],
                "body": ""
            }
        ]
}

完成这篇文章后,我使用 JSON.parse 方法将其导入到对象字面量中。这使我能够将函数解析为带有下拉菜单的表单字段,以用于人们可以做出的不同逻辑语句。我将其限制为 if/else 条件、相等语句和 return 语句,因为它们是大多数用户需要访问的三大语句,但我添加了一个高级模式,以防我需要编写更自定义的内容。

编辑函数的属性后,你会得到这样的东西。

A 类已编辑

 {
        "props": {
            "name": "Default Name",
            "type": "A_Edited"
        },
        "functions": [
            {
                "name": "hello",
                "params": ["name"],
                "body": "return `Hello, ${this.props.name}, my name is ${name}!`;"
            }
        ]
}

从预先存在的“类”创建这个新的“类”后,您可以使用 javascript 扩展运算符创建该类的新实例并将其包装在花括号中。

但是如何从基于文本的函数转变为绑定到新类的实际函数呢?这是一个简单但有效的解决方案。 类工厂

function ClassFactory(class){
    class.functions.forEach((funct)=>{
        var temporaryFunction = new Function(funct.params, funct.body);

        class[funct.name] = temporaryFunction.bind(class);
    })

    return class;
}

JavaScript 有一个 Function 对象,它有两个参数。函数参数和该函数的主体。这个脚本正在做的是获取新创建的函数,并将其绑定到类中的一个新属性,该属性以原始函数命名。将函数绑定到该类后,然后将其返回并瞧!你有一个类具有可以使用的实时函数。

所以下面写了一个有效的例子

var AEdited = ClassFactory(JSON.parse("/path/AEdited.json"));
var AEditedInstance = {...AEdited};
AEditedInstance.name = "Frank"

console.log(AEditedInstance.hello("Sam"));

/*
    This would log "Hello Frank, I'm Sam"
*/

如果您能想到任何可以改进这一点的方法,请告诉我,但我想不出更好的方法来动态创建自定义类,然后将它们推送到静态格式以供以后使用。

【讨论】:

  • 如果您想删除您的答案,请使用标记链接将其永久删除。 Stack Overflow 上的内容是根据知识共享许可证获得许可的。您需要管理员才能删除答案及其历史记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 2016-12-25
  • 2017-08-25
  • 1970-01-01
相关资源
最近更新 更多