Могу ли я написать что-то вроде следующего, не используя this
? Я хочу, чтобы карта возвращала другой объект с теми же именами методов и изменением метода foo. Как я могу получить доступ к другому методу объекта без этого?
function createSomething() {
const foo = () => 1
function map(f) {
const newFoo = () => f(this.foo())
return {
foo: newFoo,
map: map
}
}
return {
foo: foo,
map: map
}
}
const s = createSomething()
.map( x => x+1 )
.map( x => x*x )
.foo() // s === 4
В вашем случае это легко:
const newFoo = () => f(foo())
Тем не менее, вы можете создать новый экземпляр при каждой мутации и передать через него состояние (что сделало бы его намного проще):
function createSomething(state = 1){
return {
map(func){
return createSomething(func(state));
},
forEach(func){
func(state);
return createSomething(state);
},
state(){ return state }
};
}
Таким образом, вы можете:
createSomething(5)
.map( a => a +2)
.forEach( console.log) //7
.map( a => a + 8 )
.forEach( console.log) //15
.state() // 15
const start = createSomething(5),
second = start.map( a => a + 5),
last = second.map(a => a + 5);
console.log(
start.state(),//5
second.state(),//10
last.state()//15
);
Здесь вы можете это сделать другим способом - вы увидите эту форму, выраженную во многих моих других ответах здесь, на сайте
const Box = value =>
({
value:
value,
map: f =>
Box (f (value)),
ap: ({value: other}) =>
Box (value (other)),
inspect: () =>
'Box {${value}}'
})
const square = x =>
x * x
console.log (Box (3) .map (square)) // Box {3}
console.log (Box (square) .ap (Box (4))) // Box {16}
И еще один способ вы можете сделать это без интерфейса в стиле infix. Код inspect
здесь немного клочковый, но идея в том, что вы оставите этот материал, привязанный к коду разработки
const Box =
{
make: value =>
({ type: Box, value, inspect: Box.inspector (value) }),
map: (f, b) =>
Box.make (f (b.value)),
ap: (x, f) =>
Box.make (f.value (x.value)),
inspector: value => () =>
'Box {${value}}'
}
const square = x =>
x * x
console.log (Box.map (square, Box.make (3))) // Box {3}
console.log (Box.ap (Box.make (4), Box.make (square))) // Box {16}