我正在尝试用 JavaScript 构建 API/库/包,开发人员可以在其中创建模型实例,然后基于该模型创建对象实例。
例如,一个流行的例子是 Mongoose:
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"});
所以这个问题几乎是双重的。首先,如何公开一个支持new
关键字的方法(model
)来创建实例或不创建实例?
class Model {
constructor(name, schema) {
this.name = name;
// ...
}
}
module.exports = (...args) => new Model(...args);
目前在我的库中,我有类似上面代码的东西,它允许 api.model
,但不允许 new api.model
。有没有办法调整它,以便我可以允许库的用户使用任一语法选项?
其次,如何支持这个包的用户创建模型实例的实例?
创建新模型返回的是 Model
的一个实例,但是这个库的使用者不能创建它的实例,因为它只是一个对象,不能用于创建基于自身的新实例。
真正的目标是让这个 API 的接口(interface)从这个库的消费者的 Angular 来看与 Mongoose 非常相似。因此,不寻找需要库的使用者更改我发布的语法的解决方案。
最佳答案
这个问题有点迷糊。如果这不能回答您的问题,您能否详细说明一下。
我还要指出,您应该非常(我的意思是非常)小心地为用户提供如此大的权力。特别是如果您将让他们在您提供的示例中直接与您的数据库交互。我仍然不完全确定您为什么要这样做,并且会首先考虑其他选择。
无论如何,对于实例的整个创建实例,这是完全可能的。对象是对象是对象。您创建的类是一个对象,它创建对象。在 Javascript 中,我们只有原型(prototype)继承。因此,假设您有一个类的实例,并且您想要创建该实例的唯一实例,您可以使用 Object.create(instance)
。这将返回一个对象,其原型(prototype)指向您最初传递的 instance
。
对于你问题的第一部分,措辞仍然有点困惑,但我假设你想为用户创建一种方法来创建模型类的新实例。我还假设这个模型类会有更多的功能。我建议创建一个 API 类来交互和“管理”这些模型。因此,您将创建一个新类,其中包含一个方法,该方法在运行时会调用 new Model(args)
。让我知道这是否是您要找的东西。
好吧 - 所以如果你想同时使用两者,你可以使用函数构造函数:
function SomeClass() {
someObj = {};
someObj.blah = 'a';
someObj.func = function() {
console.log(this.blah);
}
return someObj;
}
您可以将其与 new SomeClass()
和 SomeClass()
一起使用
关于javascript - 如何在 JavaScript 中创建模型实例的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58864709/