JavaScript 中的原型继承问题

Prototypal Inheritance Issues in JavaScript

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

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();

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

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

firstObject = null;

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

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

Do I use memory efficient with this pattern?

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

As far I know title is shared among them

是的。

Based on the fact that we have shared variables like title and even proto, I think it does nothing and I have memory leak.

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

I have memory leak. Am I right?

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