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