Доступ к объектным методам без `this`

1

Могу ли я написать что-то вроде следующего, не используя 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
Теги:
functional-programming

2 ответа

2

В вашем случае это легко:

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
 );
1

Здесь вы можете это сделать другим способом - вы увидите эту форму, выраженную во многих моих других ответах здесь, на сайте

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}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню