Проблемы наследования прототипов в JavaScript - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть несколько вопросов о шаблоне наследования прототипа, который я использую для своего приложения.Прежде всего, посмотрите на шаблон, который я использую;

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, я думаю, что это ничего не делает, и у меня есть утечка памяти,Я прав?Если это правда, как я могу это исправить?

1 Ответ

1 голос
/ 27 сентября 2019

title является локальной переменной.Он будет существовать до тех пор, пока некоторый код может получить к нему доступ.Он будет существовать только один раз, поскольку IIFE выполняется только один раз, поэтому создается только одна переменная.Функция внутри addEmoticon может обращаться к title, другими словами, она закрывает ее .Поскольку он сам по себе локальный, он будет существовать только до тех пор, пока к нему можно получить доступ.Доступ к нему осуществляется внутри функции, хранящейся в proto.getTitle, которая снова закрывается над addEmoticon.proto.getTitle существует до тех пор, пока к proto можно получить доступ.Поскольку значение proto сохраняется в глобальной переменной const myObjectProto, к нему всегда можно получить доступ, поэтому оно будет жить вечно (как и любое значение, к которому можно получить доступ через него, например, title).

Эффективно ли я использую память с этим шаблоном?

Ну, вы выделяете несколько байтов один раз.Если предположить, что у вас есть несколько мегабайт, это не так уж много.

Насколько я знаю, заголовок распределяется между ними

Да.

Исходя из того, что у нас есть общие переменные, такие как title и даже proto, я думаю, что это ничего не делает, и у меня утечка памяти.

Вы теряете ссылку на экземпляр, хранящийся в firstObject, что делает его пригодным для сбора мусора.Это может освободить несколько байтов.Поскольку прототип все еще доступен через secondObject и myObjectProto, он будет продолжать жить.

У меня утечка памяти.Я прав?

Утечка памяти - это заметный объем памяти, который по-прежнему выделяется, хотя значения в нем больше не нужно использовать.При условии, что вы хотите работать с secondObject и создавать новые экземпляры из myObjectProto, все, что вы сохранили , по-прежнему необходимо .Ваш код в порядке.

...