Методы получения Immutable.js для вызова функций в литеральной записи объекта

Я пытаюсь передать функцию в Map так же, как вы бы использовали объектную литеральную запись. Есть ли какой-нибудь способ, свойственный Immutable, который мог бы вызвать функцию, как если бы вы использовали метод get для перечислимого метода?

var person = {
  firstName: 'John',
  lastName: 'Smith',
  format: function() {
    return this.lastName + ', ' + this.firstName;
  }
};

person.format(); // 'Smith, John'

var personMap = new Immutable.Map(person);

personMap.get('format'); // function() {return ... // doesn't work

1 ответ

Я не знаком с Immutable.js, но вы всегда можете привязать функцию к this прежде чем он попадет в коллекцию.

Самый простой случай:

person.format.bind (person);
// create immutable here

В более общем смысле, если я могу предположить, что коллекция является единственным способом, которым вы намереваетесь ссылаться на объект, и унаследованные методы не являются проблемой:

function objectAsCollection (object) {
    var key;
    for (key of Object.keys (object)) {
        if (typeof object [key] == "function") {
            object [key] = object [key].bind (object);
       }
    }
    return new Immutable.Map (object);
}

Это изменяет исходный объект, но таким образом, что вызов person.format () не влияет, и mapYouMade.get ("format")() буду иметь this указывая на person, Некоторые проблемы могут возникнуть в зависимости от остальной части вашего кода:

  • Если person становится прототипом объекта или класса, функция всегда будет вести себя так, как если бы this.format по-прежнему ссылается на прототип вместо производного объекта.
  • Если person.whateverProperty изменено, изменение не отражается в неизменной карте, но theMap.get ("format")() будет использовать новые значения, так как он привязан к исходному объекту, а не к записям на карте, а это значит, что методы в неизменяемом будут довольно изменчивыми.

Звучит так, будто вы хотите не неизменную карту, а неизменный объект; В конце концов, коллекции предназначены для однородных типов значений, а методы принадлежат объектам, к которым они относятся. В этом случае я бы посоветовал забыть о Immutable.js и использовать:

Object.freeze (person);

Что делает сам объект неизменным без опасностей, присущих коллекции. Если вам просто необходимо иметь коллекцию по какой-либо причине, вы должны расширить класс коллекции и / или использовать прокси для получения format извлекать другие записи из содержащей его коллекции, чтобы person может быть мутирован независимо. Пожалуйста, прокомментируйте, если это так, я могу показать вам, как это сделать, но я не знаком с классами Immutable.js, а прокси - сложный зверь.

Другие вопросы по тегам