javascript - 在 getter 方法中实例化类是否内存效率低下?什么 OOP 设计可以防止这种情况发生?

标签 javascript class oop

我有一个 getter 方法,可以从反序列化数据实例化类。我怀疑这是一种非常低效的做事方式

class Container {
  get content() {
    let contentList = []
    for (let c of this._content) { // this._content is an array of objects
      contentList.push(new ContentTypes[c.type](c)) //ContentTypes is a mapping between type names and classes
    }
    return contentList
  }
}

OOP 领域合适的设计模式是什么?

最佳答案

无论代码是在 getter 还是方法中,效率都不会改变。但改变的是使用您的类编写代码的人的期望。

我不认为访问对象的属性会产生太多开销。因此,当使用 Container 实例时,如果我看到 contents 属性,我不会期望它做很多工作。你的(有一点)。

我会:

  1. 保留返回内容的副本(使返回内容不可变),并且仅在其依赖的内容发生变化时才丢弃它,或者

  2. 使其成为一个方法(显式)。

(或者我可能两者都做。)

我预计方法调用会比属性访问产生更多的开销。我不知道是否有一个具体的 OOP 原则可以引用,但这是我的经验观点(无论它是否值得)。

但是,请注意,存在反例。一个著名且可直接应用的属性是 DOM 元素的 innerHTML 属性,它是一个访问器属性,在使用时可以完成相当多的工作。

这是一个返回您保留并重新返回的不可变事物的示例,但当其基础数据发生更改时该事物会失效:

class Container {
    constructor() {
        this._content = [];
        this._exposedContent = null;
    }

    addContent(content) {
        this._content.push(content);
        this._exposedContent = null; // Invalidating the cached copy if any
    }

    get content() {
        // Do we have a cached copy?
        if (!this._exposedContent) {
            // No, create it
            this._exposedContent = this._content.map(
                c => Object.freeze(new ContentTypes[c.type](c))
            );
        }
        return this._exposedContent;
    }
}

(您也可能在一段时间后使副本过期。)

但是,与您的 content 访问器中的代码实际内容相比,是否值得内存开销和复杂性需要判断。我的默认立场是使用方法(getContent 或类似方法)而不是缓存,但这是一个判断调用。

关于javascript - 在 getter 方法中实例化类是否内存效率低下?什么 OOP 设计可以防止这种情况发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59611344/

相关文章:

class - 如何通过扩展自定义小部件来创建新的小部件?

ruby - Ruby 程序员如何进行类型检查?

javascript - 如何在 JavaScript 的 for 循环中创建动态变量以返回 json?

javascript - Heroku:将 Node 更新到最新版本

javascript - 将响应映射到可变 Angular 5

jquery - 在 jQuery 中使用 OO 概念,使用 function() 并创建结构数组

python - 我应该使用 "self"来定义不需要从外部访问的类实例化变量/对象吗?

javascript - 在 JQuery 中链接到带有空格的文件

c++ - vector.size() 始终返回 0

C++ Runtime类切换,依赖基类继承