JavaScript 寺子屋 21 / object の中に関数をしまう。
Tweetさて、寺子屋の塩梅がかなりわかってきたはずです。
今日はちょっとだけ難しい。
がんばろう〜
オブジェクトの中に関数をしまう
オブジェクトの中に数値や、文字列や、配列をしまってきました。
実は、関数をしまうこともできます。
オブジェクトのプロパティに関数をしまう
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 で教えてください!
以上です!