【问题标题】:Prototypal Inheritance Issues in JavaScriptJavaScript 中的原型继承问题
【发布时间】:2019-09-27 11:55:19
【问题描述】:

我对我的应用程序使用的原型继承模式有一些疑问。首先看一下我正在使用的模式;

const myObjectProto = (function() {

  const proto = Object.create( parentProto );

  // private variables
  let title = 'Some String';

  // private functions
  const addEmoticon = function() {
    return title + ' ';
  }

  proto.getTitle = function() {
    return addEmoticon();
  }

  return proto;
})();

当我想使用它时,我会像下面这样使用它:

const firstObject = Object.create( myObjectProto );
const secondObject = Object.create( myObjectProto );

// call a public function
firstObject.getTitle();
secondObject.getTitle();

我的第一个问题是:假设我们从对应的 proto 创建 100 个对象;据我所知title 在他们之间共享。这意味着如果一个函数改变了它,它将为所有创建的对象而改变。我有点担心这种情况下的记忆。我是否在这种模式下使用内存效率?有人可以澄清Object.create 是如何对待title 的吗?

我的第二个问题是关于内存泄漏的;假设我们要将 firstObject 设置为 null;

firstObject = null;

基于我们共享变量的事实,例如title 甚至proto,我认为它什么也没做,而且我有内存泄漏。我对吗?如果这是真的,我该如何解决?

【问题讨论】:

    标签: javascript memory-leaks prototypal-inheritance


    【解决方案1】:

    title 是一个局部变量。只要某些代码可以访问它,它就会存在。它只会存在一次,因为 IIFE 只执行一次,因此只会创建一个变量。 addEmoticon 内部的函数可以访问title,换句话说,它在它上面闭包。由于它本身就是一个本地的,所以它也只会在可以访问的情况下存在。它在存储在proto.getTitle 中的函数内部被访问,该函数再次关闭 addEmoticon。只要proto 可以访问,proto.getTitle 就存在。由于proto 的值存储在全局变量const myObjectProto 中,因此它始终可以被访问,因此它将永远存在(以及可以通过它访问的每个值,例如title)。

    我是否在这种模式下使用内存效率?

    好吧,你一次分配几个字节。假设您有几兆字节可用,那就不多了。

    据我所知,他们之间共享标题

    是的。

    基于我们共享变量(如 title 甚至 proto)的事实,我认为它什么也没做,而且我有内存泄漏。

    您失去了对存储在firstObject 中的实例的引用,从而使其可用于垃圾收集。这可能会释放几个字节。由于原型仍可通过secondObjectmyObjectProto 获得,它将继续存在。

    我有内存泄漏。我说的对吗?

    内存泄漏是指显着数量的内存,尽管其中的值不再需要使用,但仍会被分配。假设您想使用secondObject,并从myObjectProto 创建新实例,您存储的所有内容仍然需要。您的代码非常好。

    【讨论】:

    • 很好的答案。那么如何解决这个内存泄漏呢?
    • 你没有内存泄漏。
    • 嗯,在某些情况下,我需要删除所有对象并创建新对象。所以我只需要myObjectProto 就可以了。如果我将所有创建的变量都设置为null 然后再次创建它们,是否会导致内存泄漏?
    • 再次:您没有内存泄漏。重新创建所有变量将导致前后相同的内存消耗。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2010-09-28
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多