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

标签 javascript

我正在尝试用 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/

相关文章:

javascript - NodeJS/Express 中的 "module.exports"和 "exports.methods"是什么意思?

javascript - 显示/隐藏列表选择全部而不是单独选择

Javascript 计数器函数 onload 不起作用

javascript - 无法将图像拖入 div

javascript - 仅从对象 javascript 数组中过滤唯一值

javascript - 匹配数组中的值并从函数返回另一个数组

javascript - 将 angularjs 应用程序嵌入另一个 angularjs 应用程序

javascript - Angular Ui-Bootstrap 在页面加载时折叠闪烁

javascript - 类型检查和泛型

javascript - 如何避免对此进行硬编码?在装饰器中