2021年3月第3週レポート

インプット

📝 「JavaScript関数型プログラミング」を読んでいる

少し前から関数型のパラダイムに興味を持っていたのですが、どうも長続きせずにいました。OCaml、Erlang、Haskellといった言語の本をかじったりはしていたのですが、だいたい再帰あたりのトピック前後でフェードアウトしているのが実情でした。

前々から書いているような気がしますが、自分の設計力をもう少し伸ばしたいという気持ちがあるのと、さまざまな言語で関数型のエッセンスが入りつつある現状をみると、やはりある程度はこのパラダイムに触れたほうがいいという気持ちがまた強くなってきました(定期的に発症する)

今回はもうちょっと自分が普段触っている言語に近いものを使おうということで次の本をチョイスしました。

今は4章付近のカリー化や部分適用といったトピックまで内容を把握しました。以前からこれらのワードは知っていましたが、何となく同じことじゃないのか?と思っていたのですが、本書を読んで差異が少しずつわかってきました。

あわせて読書メモとして言語化も試みているのでもう少しうまくできたら自分の理解を公開しようかなと思います。

📝 JavaScriptのプロトタイプチェーン

プロトタイプ

オブジェクトの生成方法はいくつかあるが、代表的なものとしてコンストラクタ関数を使ったものがある。

function MagicalGirl(name, device) {
    this.name = name
    this.device = device
    this.transform = function() {
        console.log(`${this.device}!! setup!!`)
    }
}

const nanoha = new MagicalGirl('nanoha', 'raising heart')
nanoha.transform() // raising heart!! setup!!

const fate = new MagicalGirl('fate', 'Bardiche')
fate.transform() // Bardiche!! setup!!

コンストラクタ関数にて、thisに関数を含ませた場合、インスタンスを作成するたびに関数の分もメモリを消費してしまうという特徴がある。

コンストラクタ関数はprototypeプロパティを持っており、このプロパティが参照するオブジェクトをプロトタイプオブジェクトという。

プロトタイプオブジェクトのプロパティに関数を追加すると、new演算子で作成したインスタンスも、プロトタイプオブジェクトに追加した関数(=メソッド)を利用することができる。

function MagicalGirl(name, device) {
    this.name = name
    this.device = device
}

MagicalGirl.prototype.transform = function () {
    console.log(`${this.device}!! setup!!`)
}

const nanoha = new MagicalGirl('nanoha', 'raising heart')
nanoha.transform() // raising heart!! setup!!

const fate = new MagicalGirl('fate', 'Bardiche')
fate.transform() // Bardiche!! setup!!

すべてのオブジェクトは内部プロパティとして[Prototype]を持っている。このプロパティはコンストラクタ関数のプロトタイプオブジェクトを参照している

なお、ECMAScript6ではオブジェクトの[Prototype]にアクセスする手段として__proto__プロパティが提供されている。

const nanoha = new MagicalGirl('nanoha', 'raising heart')
console.log(nanoha.__proto__ === MagicalGirl.prototype) // true

プロトタイプチェーン

例えば、以下のコードを実行すると

const miyuki = {
    name: 'miyuki',
    sayHello: function () {
        console.log(`Hello, my name is ${this.name}`)
    }
}

const happy = {name: 'cure happy'}
happy.__proto__ = miyuki

happy.sayHello() // Hello, my name is cure happy

標準出力にはHello, my name is cure happyが出力される。

JavaScriptではオブジェクトにプロパティが存在しないとき、__proto__プロパティが参照するオブジェクトがそのプロパティを持っていないか確認しにいく。 上の例だと、happyオブジェクトにはsayHelloプロパティが存在しないので、__proto__プロパティが参照するmiyukiオブジェクトがsayHelloを持っていないか確認しにいく。miyukiプロパティはsayHelloプロパティを持っているので、このプロパティが参照しているメソッドを実行する、という流れになっている。 このように__proto__プロパティを辿って参照を解決するこの仕組みをプロトタイプチェーンという。

アウトプット

年度末ということもあり、仕事の方がいろいろあるのと、JavaScript関数型プログラミングのインプットにかなりパワーを割いてしまったので、これといったアウトプットは今週ありません。

RustでNESがちょっと止まってしまっているのが個人的には気がかり。せっかくRustに着手したのにここでブランクが空いてしまうのはもったいないと思いつつ、今取り組んでいるインプットも集中してやりたいという気持ちがあるので悶々としています。

Profile
d_yama
元Microsoft MVP for Windows Development(2018-2020)
Sub-category : Windows Mixed Reality
Search