使用多个操作创建多个对象的最优化方法

Most optimized way to create multiple objects with several operations

所以我一直在研究工厂函数和 类,寻找创建多个对象的最优化方法,每个对象有几个 functions/operations。

假设我正在做一个 TODO 列表,我创建的每个任务都有 7 个参数和更多操作,但主要是 getter 和 setter。

如果我使用工厂函数创建这些任务中的每一个,则创建的每个对象都会在内存中为每个创建的任务创建近十几个函数,对吗?

既然我们有 Object.create() 创建一个对象作为另一个对象的原型,那么将 taskOperations 作为一个独立的对象分开并像我下面那样使用 Object.create(taskOperations) 会更好吗避免为所有创建的对象使用相同的函数阻塞内存?

这是最优化的方式还是使用 类 更有效?

const taskOperations = {
    getTitle() {
        return this.title;
    },
    setTitle(title) {
        this.title = title;
    },
    getDateCreated() {
        return this.dateCreated;
    },
    setDateDue(dateDue) {
        this.dateDue = dateDue;
    },
    getDateDue() {
        return this.dateDue;
    },
    setPriority(priority) {
        this.priority = priority;
    },
    getPriority() {
        return this.priority;
    },
};

// Task factory
const createTask = (title) => {
    let task = Object.create(taskOperations);
    task.title= title;
    task.dateCreated= new Date();
    task.dateDue= "";
    task.priority= false;
    task.note= "";
    task.done= false;
    task.projectID= 0;
    return task
};

提案

您目前关心的是在不同的对象上复制多个相似的函数,因为这会增加内存使用量。

我们可以利用正在使用的语言类型,即解释和“真实”的空间很小data encapsulation

在Java脚本中,所有都是“public”或可访问的,即没有数据封装,因此对象属性足以access/change对象的状态(即在哪里你有 setters/getters 例如 setTitlegetTitle).

对于更复杂的操作并试图减少多个类似函数的内存开销,您可以创建一个 "singleton" 服务(我在这里使用了引号,因为这或多或少是您应用它的方式,而不是希望根据您使用的语言类型对其进行限制)class 具有方法或预期的操作。然后每个方法将接受一个 task 对象和执行操作所需的任何其他详细信息,并在必要时更新任务的相应状态。这意味着对于内存中的 15,000 tasks,您将不再需要 15000 * [num of task operations].

这可能看起来像(这个实现真的是语法糖和基于决策的):

const TaskService = {
    getTitle(task) {
        return task.title;
    },
    setTitle(task,title) {
        task.title = title;
      
    },
    getDateCreated(task) {
        return task.dateCreated;
    },
    setDateDue(task,dateDue) {
        task.dateDue = dateDue;
    },
    getDateDue(task) {
        return task.dateDue;
    },
    setPriority(task,priority) {
        task.priority = priority;
    },
    getPriority(task) {
        return task.priority;
    },
};

无论 classes 与否,我们的想法是在可能的情况下分离关注点,即保持 class 简单,我们可以 classes 只是存储状态(例如你在哪里在工厂中创建对象)和 classes 允许我们执行不同的操作。

我希望这有助于决策过程。有很多软件设计和 anti-design 模式。

进一步阅读

许多关于设计模式的文献通常参考类型化语言(例如,Java、C# 等),但我希望这也可能有所帮助

文章 - https://www.toptal.com/javascript/comprehensive-guide-javascript-design-patterns 创建 Java 脚本对象的其他方法 - Which way is best for creating an object in JavaScript? Is `var` necessary before an object property?