2016-12-08 20 views
2

私は雇用者から完了するためのクイックJSテストを受け取りました。setter/getterを持つコンストラクタは文字列を返します

注:「===」で通信するには、以下の使用されているJavaScriptを使用して

は、 例に係る「チャート」機能を実装:最後の質問に彼は次の操作を行うに頼ま期待される出力。

var myBarChart = chart(); 
myBarChart.type() === 'line'; 
myBarChart.type('bar'); 
myBarChart.type() === 'bar'; 
myBarChart() === "Here's your bar chart!"; 

var myScatterChart = chart().type('scatter'); 
myScatterChart() === "Here's your scatter chart!"; 

私はそれを行うことができないと述べたが、それは無効である、または私はちょうど完全に私の心を失いましたか?それは新しいパラメータを持っていないので、コンストラクタではありません。また、セッターを受け入れるならば、文字列を返さないでしょう。または私は間違っていますか?

私の質問に答えてください。私は今や気分が悪いです。

+0

だから、正確にあなたの質問は何ですか?一度に1つずつ、ラインごとに要件を満たすだけです。 1行目 - 'chart'という名前の空の関数を作成します。完了しました。 2nd - 'line'文字列を返す関数である' type'という名前のプロパティを持つオブジェクトを返します。完了しました。等 – zerkms

+0

特別なことは何もない、単純なオブジェクトの使用。しかし、なぜ私はあなたが 'myBarChart()'を困惑させたのか分かりますが、それはどのように可能ですか?まあ、関数もオブジェクトです。 – dfsq

+0

あなたは私のためにこの例を書いてもらえますか?答えとして。私は完了としてそれをマークします – patrykcieszkowski

答えて

3

ここにはいくつかの概念があります。

function chart() { 
     var fn = function() { 
      console.log('You are calling the anonymous function!') 
     }; 

     return fn; 
} 

let myBarChart = chart(); 
myBarChart(); 

第二に、あなたは関数に追加のフィールドを添付することができます。

まず第一に、あなたは別の関数を返す関数を持つことができます。 (あなたが間違っているかもしれないC#またはJavaのバックグラウンドから来た場合、Javascriptでこれを行うことができます)。

function chart() { 
     var fn = function() { 
      console.log('You are calling the anonymous function!') 
     }; 

     // Attaching a new field 
     fn.type = function() { 
      console.log('Now you are calling the type function!'); 
     } 
     return fn; 
} 

let myBarChart = chart(); 
myBarChart.type(); 

第三に、あなたはゲッターやセッターと同じ機能を使用してJavaScriptでpatternがあります。それはSoftware Engineering Stackexchange siteで議論されています。

function chart() { 
    var typeValue = 'line'; 

    var fn = function() { 
     return (typeValue === 'line' ? "Here's your line chart!" : "Here's your bar chart!"); 
    }; 


    fn.type = function(value) { 
      if(typeof(value) !== 'undefined') { 
      typeValue = value; 
      return fn; 
      } else { 
      return typeValue; 
      } 
    }; 

    return fn; 
} 

let myChart = chart(); 
myChart.type() === 'line'; 
myChart() === "Here's your line chart!"; 
let setterReturnValue = myChart.type('bar'); 
setterReturnValue === myChart; 
myChart() === "Here's your bar chart!"; 

この例では、これら3つの概念を使ってできることを示しています。

+0

非常に明確に説明されています。ニース! –

+0

これを私に説明してくれてありがとう。それは多くを助ける! – patrykcieszkowski

1

関数はファーストクラスのオブジェクトであることを知る必要があります。つまり、他の通常のオブジェクトと同様に、プロパティを持つことができます。あなたはこのような何かを実装できることを知っています。ここでは一つの可能​​な解決策は以下のとおりです。

function chart() { 
    const obj =() => `Here's your ${obj.type()} chart!` 
    let __type = 'line' 

    obj.type = type => { 
    if (type) { 
     __type = type 
     return obj 
    } 
    return __type 
    } 
    return obj 
} 
  1. var myBarChart = chart()からchartは、新しい関数を返す必要があります。

  2. myBarChart.type() === 'line'は - 関数がタイプのいくつかの並べ替え(lineまたはchart)を返す別の関数であり、type性質を持っている必要があります返されました。

  3. myBarChart.type('bar') - セッターとして使用する場合、__typeを新しい値に設定します。ローカル変数__typeとして保存しましょう。

  4. chartは、呼び出されたときにタイプ情報の文字列を返す関数を返します。

+0

'type'にローカル変数を使用し、返されたオブジェクトを壊さないようにすると、改善されるかもしれません。 – zerkms

+0

@zerkmsいいアイデアです、ありがとうございます。 – dfsq

+0

が正確であることは、 'line()'が関数を返す必要があることを示す、1行目と5行目の組み合わせです。 p –

3

間違いなく可能です。最初の行var myBarChart = chart();chartが関数であるので、あなたが持っていることを示しています:

function chart () { 

} 

次の行myBarChart.type()chart()によって返された値が'line'を返す関数そのものですtypeプロパティを持つオブジェクトであることを示しています。だから今あなたが持っている:

function chart () { 
    return { 
     type: function () { 
      return 'line'; 
     } 
    } 
} 

を次の行myBarChart.type('bar');はあなたに自分自身では何も教えてくれませんが、それ以降の行は.type()への後続の呼び出しは、新しい型を返す必要があることを教えてくれるので、.type()は両方として機能していますセッターとゲッター(例えば、jQuery's valに類似)。

function chart () { 
    var storedType = 'line'; 
    return { 
     type: function (newType) { 
      if (newType) 
       storedType = newType; 
      else 
       return storedType; 
     } 
    } 
} 

myBarChart()chartの戻り値は実際には関数ではなく、プレーンなオブジェクトであるために必要なことを教えてくれる、次の行:だから今のようなものを持っています。その関数は'Here\'s your ' + storedType + ' chart!'を返す必要があり、オブジェクトが以前持っていたプロパティtypeを持つ必要があります。関数にプロパティを追加する最も簡単な方法は、その関数を変数に格納してプロパティを追加することです。だから、結果は次のとおりです。

function chart () { 
    var storedType = 'line'; 
    var func = function () { 
     return 'Here\'s your ' + storedType + ' chart!'; 
    }; 
    func.type = function (newType) { 
     if (newType) 
      storedType = newType; 
     else 
      return storedType; 
    } 
    return func; 
} 

次の2行var myScatterChart = chart().type('scatter');.typeが引数で呼び出されたときchart()を呼び出すことによって返されたとして、それは同じ機能を返すべきであることを示しています。それが答えを完了するために、funcまたはthisを返すのいずれかによって行うことができます。

function chart () { 
    var storedType = 'line'; 
    var func = function () { 
     return 'Here\'s your ' + storedType + ' chart!'; 
    }; 
    func.type = function (newType) { 
     if (newType) { 
      storedType = newType; 
      return func; 
     } else 
      return storedType; 
    } 
    return func; 
} 
+0

3番目のコードサンプルまでは、私がしばらくあった場所でしたが、気づいたように、それは意味がありませんでした。しかし、関数はJSのオブジェクトなので、私はそれを完全に無視しています。私の頭の後ろにそれがあったとしても。私はこの日が私の日ではないことを知っていました。あなたの努力のためにありがとう! – patrykcieszkowski

+0

@JanKulczykようこそ。私はそれを壊した方法があなたのために役立ったことを願っています。 – Paulpro

関連する問題