さて、実は全てのオブジェクトにはprototypeというプロパティが存在しています。
Object.create(null)
で prototypeを持たないオブジェクトを作れるという反例が一応あります。
趣旨的には例外的な存在なので、注釈とかあるといいかなぐらいです。
17で書いたようなObject.create(null)
で使うのはたまに見るかな(ライブラリとかNode.jsの内部とかで)という感じですが、これも一応class A extends null
という感じで同じ表現できるんですね。
仕様的な側面からいうと、構文(class構文)でできることは関数(Object.create
やReflect.construct
など)でできるようにデザインされていることが殆どですね。
なので、使い手によって自由に使うものを選んでくださいという感じになっています。
多くの人にとってはclass構文のほうが読みやすいと思います ぐらいだと、関数スタイルが好きな人にとってもFUDに取られなくなると思います。
参照が弱くなったおかげでWeakMapからオブジェクトへの参照が存在しないため、上記の※時点でもともとのobj2のメモリを解放することができます。
少し解説が変?
deleteのケースはMapと同じなので、WeakMapの解説ではないかも。
obj2
のケースは、WeakMapはkeyの参照をweakに保持するため、keyだったobj2
がどこからも参照されなくなった時点で、WeakMapからも開放できるという感じな気がする。
参照が弱くなったおかげでWeakMapからオブジェクトへの参照が存在しないため
WeakMapからのweakな参照としてkey(obj2
)への参照は一応あるはずです。この参照がkeyとなるobj2
がどこからも参照されなくなった(GC可能)なときに、WeakMapからも消えるという感じだと思います。
ちょっと文章から読み取ることができなかったです。
https://qiita.com/tsin1rou/private/6dd524200da9d88f1038#30-%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%82%BA%E3%83%A0
自作classの名前が欲しい時はgetPrototypeOf().constructor.nameなんかが良いんじゃないかと今思いつきましたがどうなんでしょうか。
一応とれはするのですが、多くのアプリケーションコード(特にブラウザ)はminifyが前提になっているので、.name
で取れる名前もminifyされて意図通りにならないという問題がよく発生します。
なお、async awaitでは.catch()の代わりにtry ~ catch構文を使用します。
async関数においてtry/catchではなくawait/catchパターンを活用する - Qiitaというパターンをやってる人もいますね。 まだプラクティスがちゃんと決まってないからかもしれなですね。
try ~ catch構文を使用できます。
とかでもいいかもしれないですね。
コードスタイル的な話になってしまうのですが、演算子や=>
とかの前後はスペースを空けたほうが、構文を見慣れていない人にとっても読みやすくなると思います。(見慣れていないとどこに区切りがあるかがつかめない)
const count = arr.reduce((acc, cur)=>acc+(cur.match(/の/g)||[]).length, 0);
->
const count = arr.reduce((acc, cur) => acc + (cur.match(/の/g)||[]).length, 0);
ものすごく雑にやるなら、prettierとかを一度記事に対してかけてしまうとか。 (余計なかっことか増えそうですが、統一感はでる)