2017-09-09 13 views
1

thisを使用せずに次のようなコードを書くことはできますか?同じメソッド名とメソッドfooが変更された別のオブジェクトをマップに戻したい。これを使わないでオブジェクトの別のメソッドにアクセスするにはどうすればよいですか?`this 'なしのオブジェクトメソッドへのアクセス

お使いの場合その簡単に
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 

答えて

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}

に添付その原料を残したいです
関連する問題