Я не знаком с 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, а прокси - сложный зверь.
Можете ли вы количественно определить «чище»? Я не думаю, что 'format' будет иметь право' this' здесь также. – sqykly
Я отредактировал для ясности. – brogrammer
Я просто хочу сказать, что immutable.js не работает таким образом. То, что «это» в коде определенно указывает на другое место. – jiyinyiyong