今日の参考コード

さて、寺子屋の塩梅がかなりわかってきたはずです。

今日はちょっとだけ難しい。

がんばろう〜

オブジェクトの中に関数をしまう

オブジェクトの中に数値や、文字列や、配列をしまってきました。

実は、関数をしまうこともできます。

オブジェクトのプロパティに関数をしまう
const sayHi = param => {
  return param + " Hi!!";
};

// オブジェクトにしまう
const myObject = {
  name: "my name",
  age: 35,
  myFunction: sayHi
};

myFunction というプロパティに、関数をしまうことができました。

オブジェクトにしまわれている関数にアクセスして実行する

関数だからといって特殊なことはありません。

今までどうりに object.name でアクセスすればいいだけです。

ただ、今までと少し違うのは、そうやってアクセスしたプロパティにしまわれた値は「関数」なので、この関数を実行するためには、() を最後につけてやる必要がある点です。繰り返しになりますが、関数だからです。これはオブジェクト特有のルールではなく、あくまで今までと同じく関数を実行するための行為です。

以下の例でいうと myObject.myFunction("nakanishi") の部分ですね。

オブジェクトのプロパティにしまわれた関数を実行する
const res = myObject.myFunction("nakanishi");
expect(res).toEqual("nakanishi Hi!!");

() をつけずに myObject.myFunction と書いた場合には、単にその関数を値として受け取ります。こういう処理が必要な時ももちろんあります。こんなふうに型を判断する場合などです。

関数を実行せず、単に値として受け取る
const res = getType(myObject.myFunction);
expect(res).toEqual("function");

テストの全体像

オブジェクトにしまわれた関数を実行する
import { getType } from "typechecker";

describe("function in object", () => {
  // 関数を作って
  const sayHi = param => {
    return param + " Hi!!";
  };

  // オブジェクトにしまう
  const myObject = {
    name: "my name",
    age: 35,
    myFunction: sayHi
  };

  // まずは普通のプロパティへのアクセスを思い出す
  it("type of name propety", () => {
    const res = getType(myObject.name);
    expect(res).toEqual("string");
  });

  it("value of name propety", () => {
    const res = myObject.name;
    expect(res).toEqual("my name");
  });

  // myFunction プロパティに入っているのは?
  it("type of myFunction propety", () => {
    // 実行せずに値としての関数を受け取る
    const res = getType(myObject.myFunction);
    expect(res).toEqual("function");
  });

  // myFunction プロパティに入っていた関数を
  // 実行する
  it("call object method", () => {
    const res = myObject.myFunction("nakanishi");
    expect(res).toEqual("nakanishi Hi!!");
  });
});

宿題

  • 関数を作る
  • オブジェクトにしまう
  • テストを書いて、関数が入ったプロパティにアクセスし、
  • その値の型を調べ、
  • またその関数を実行する

少し今日は難しいかもしれない。わからなかったら slack で教えてください!

以上です!