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に着手したのにここでブランクが空いてしまうのはもったいないと思いつつ、今取り組んでいるインプットも集中してやりたいという気持ちがあるので悶々としています。