abcdefGets読者になるabcdefGetsゲッツ!2017-10-12EcmascriptのprotocolについてEcmascriptにprotocolを実装するという提案がある。proposal-first-class-protocolもともとGotanda.jsで発表した内容だけどいろいろ追記した。元々はinterfaceの提案だった。それが名前と形を変えてprotocolの提案になった。protocolとは?classが実装すべき規約。interfaceと違って型ではなく規約を提供する。実態はSymbolのコレクションになっている。上の実装を見るとわかるけど、protocolのメンバーは自動的にSymbolになる。protocolを実装するクラスはそのSymbolを実装しなければいけない。protocolは複数実装できる。{}}またprotocolは実装を持つこともできる。ClassNameのインスタンスで呼べるこのprotocolは実装を持っていて、それを実装したクラスは同時に実装も引き継ぐ。traitの様に振る舞うことができる。拡張さらに既存のクラスも拡張することができる。Arrayを拡張する場合。既存のクラスにもprotocolを適用することができる。チェックあるクラスがprotocolを実装しているかどうかは、instanceofでは判定できない。implements演算子が提案されている。}上記の例のようにimplementsキーワードが演算子のように振る舞う。extendsprotocol自体は既存のprotocolを拡張することができる。}こんな感じでprotocolは複数のprotocolを拡張することができる。上記の拡張を利用するとデフォルト実装を持つprotocolを定義することができる。Aを拡張し更にaを実装している。Classのインスタンスに対してA.aを呼び出すことが可能になる。protocolprotocolはなんと静的プロパティ(!)に対しても作用させられる。}C[A.b]();これはどうなんだ...TypeScriptとりあえず既存のinterfaceは残すであろうとのこと。protocolをどのような型として扱うかは未定。typesという型のプロパティ名にsymbolを使うことができるPRが進んでいるので、これが実装されるとprotocolもスムーズにいけるかも。ちなみにここで議論しています。GitHubprototypeへの直接代入について先程、既存のクラスにprotocolを実装するケースでprototypeへ直接代入するという例を出したが、prototypeへの直接代入は何か気持ち悪い...(Object.definePropertyすらない時代からjsを書いていたせいなのか?)のでそれはやめてくれ!その代わり既存のクラスをopen-classにして拡張できるようにすれば良くない?というアバウトな提案をしてみた。Array.prototype.map}こんな感じ。結果とりあえず、classがprototypeを隠蔽したのにこれじゃES5時代じゃないか!って思いを伝えたら。classはprototypeを隠蔽したわけじゃないよ。prototypeへの代入もES5時代的ではない。Ecmascriptのモンキーパッチ方法は常にprototypeだし、これからもjsは未来永劫変わらずこの方法なのさ。とこのような調子で言われた。classベース言語になりたがってるように見えていた私にとって、これが目指す世界ならもう言うことは無かったので議論を打ち切った。prototypeはもう触りたくないんじゃ!おしまい。2はてなブログをはじめよう!brn_takeさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。