2017-02-14 15 views
0

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

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

Можете ли вы количественно определить «чище»? Я не думаю, что 'format' будет иметь право' this' здесь также. – sqykly

+0

Я отредактировал для ясности. – brogrammer

+1

Я просто хочу сказать, что immutable.js не работает таким образом. То, что «это» в коде определенно указывает на другое место. – jiyinyiyong

ответ

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, а прокси - сложный зверь.

 Смежные вопросы

  • Нет связанных вопросов^_^