gpt4 book ai didi

javascript - 手动实现extends/super

转载 作者:行者123 更新时间:2023-11-28 05:26:32 24 4
gpt4 key购买 nike

我正在根据从数据库中提取的描述性数据动态构建类。例如,如果数据如下所示:

ClassName = ExampleParent
Method1.name = "greet"
Method1.code = "console.log(\"Parent hello\");"

像这样构建它效果很好:

classList[ClassName] = function(){}
classList[ClassName].prototype[Method1.name] = Function(Method1.code);

var Bob = new classList["ExampleParent"]();
Bob.greet();

但我对如何动态创建继承感到困惑:

ClassName = ExampleChild
ClassExtends = ExampleParent
Method1.name = "greet"
Method1.code = "super.greet(); console.log(\"Child hello\");"

我不明白如何使用ExampleChild.prototype来指向ExampleParent并包含ExampleChild的自定义方法,甚至当我尝试时,它说super未知。我不需要支持任何花哨的东西(私有(private)的、静态的等)...我只需要 thissuper 来工作。提示?

最佳答案

不幸的是,你不能不使用eval(或者通过让Function返回一个完成工作的函数来有效地使用eval),但这仍然符合您正在做的事情,因为 Function 允许任意代码执行,就像 eval 一样。不过,还是很丑。

绝对信任数据源非常重要。由于 eval(和 Function)允许执行任意代码,因此您不得(例如)允许用户 A 编写将存储在数据库中供用户 B 检索和使用的代码,而无需绝对信任用户 A。这使用户 B 面临风险,可能使他们遭受恶意攻击来自用户A的代码。

有了这个警告,您可以使用 eval 来完成,例如:

const className = "ExampleChild";
const parentName = "ExampleParent";
const methodName = "greet";
const methodCode = "super.greet();";
const C = eval(`
class ${className} extends ${parentName} {
${methodName}() {
${methodCode}
}
}`
);

您可能需要一个对象来按运行时名称存储类,因为这是 extends 子句所需要的。

示例:

const classes = {};
function buildClass(spec) {
const extendsClause = spec.parentName ? ` extends classes.${spec.parentName}` : "";
const methods = spec.methods.map(
mspec => `${mspec.name}() { ${mspec.code} }`
).join("\n");
const cls = classes[spec.className] = eval(`
class ${spec.className} ${extendsClause} {
${methods}
}`
);
return cls;
}

const specs = [
{
className: "ExampleParent",
methods: [
{name: "greet", code: "console.log(\"Parent hello\");"}
]
},
{
className: "ExampleChild",
parentName: "ExampleParent",
methods: [
{name: "greet", code: "super.greet(); console.log(\"Child hello\");"}
]
}
];

specs.forEach(buildClass);

let c = new classes.ExampleChild();
c.greet();

关于javascript - 手动实现extends/super,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40112843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com