如何在JavaScript中创建模型实例的实例?

时间:2019-11-14 19:49:44

标签: javascript

我正在尝试用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非常相似。因此,不要寻找需要库的使用者更改我发布的语法的解决方案。

1 个答案:

答案 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()

一起使用