我正在尝试用JavaScript构建API /库/包,开发人员可以在其中创建模型实例,然后基于该模型创建对象实例。
例如,一个流行的例子是猫鼬:
const mongoose = ...
const modelA = new mongoose.model("Cat", {name: String});
const modelB = mongoose.model("Cat2", {name: String});
const cat = new modelA({name: "Tom"});
const catB = new modelB({name: "Smith"});
所以问题几乎有两个。首先,如何公开支持model
关键字的方法(new
)来创建实例?
class Model {
constructor(name, schema) {
this.name = name;
// ...
}
}
module.exports = (...args) => new Model(...args);
当前在我的图书馆中,我有类似上面的代码,该代码允许api.model
,但不允许new api.model
。有没有一种方法可以对此进行调整,以便允许库的用户使用这两种语法选项?
第二,如何支持该程序包的用户创建模型实例的实例?
创建新模型所返回的内容是Model
的实例,但是此库的使用者随后无法创建该实例,因为它只是一个对象,不能用来创建一个基于自身的事物的新实例。
从该库的使用者的角度来看,真正旨在使该API的接口与Mongoose非常相似。因此,不要寻找需要库的使用者更改我发布的语法的解决方案。
答案 0 :(得分:1)
这个问题有点困惑。如果这不能回答您的问题,您能否详细说明一下。
我还要指出,您应该非常谨慎地(并且我的意思是极端)向用户提供如此强大的功能。尤其是如果您要让它们在提供程序的示例中直接与数据库交互。我还是不太确定为什么要这么做,并且会首先考虑其他选择。
无论如何,对于实例的整个创建实例来说,这是完全可能的。对象就是对象就是对象。您创建的类是一个对象,它创建对象。在Javascript中,我们实际上只有原型继承。因此,假设您有一个类的实例,并且想要创建该实例的无用实例,则可以使用Object.create(instance)
。这将返回一个对象,其原型指向您最初传递的instance
。
对于问题的第一部分,在措词上还是有些困惑,但是我假设您想为用户创建一种创建模型类的新实例的方法。我还假设此模型类将具有更多功能。我建议创建一个API类来交互和“管理”这些模型。因此,您将创建一个新类,该类上具有一个方法,该类在运行时会调用new Model(args)
。让我知道这是否是您想要的。
好的-因此,如果您想同时使用两者,则可以使用函数构造函数:
function SomeClass() {
someObj = {};
someObj.blah = 'a';
someObj.func = function() {
console.log(this.blah);
}
return someObj;
}
您可以将其与new SomeClass()
和SomeClass()