プロトタイプベースの言語です。内部スロット)を持っており、それを辿ることで継承を表現します(プロトタイプチェーン)。基本的にどのオブジェクトも凍結されておらず、好きにプロパティを追加していくことができます。サイトを開発していました。オブジェクトが直接所有するプロパティとプロトタイプチェーンの中に持つプロパティとの区別が付きづらいなどの理由からバグを引き起こすようになってしまいました。Pollution)と呼ぶようになりました[1]。追加するのが主流になったため、ライブラリを使うことによるプロトタイプ汚染はあまり聞かなくなりました[2]。最近はどちらかといえばプロトタイプを悪用した攻撃にプロトタイプ汚染という言葉が使われています。書き換えを試みて、想定していないプロパティを持つオブジェクトとして扱わせる攻撃が有名です。ついて詳しくは過去の記事を御覧ください。https://zenn.dev/petamoriken/articles/a211183011cd58グローバルやプロトタイプの変更に耐えうるコード突然ですが以下のようなモジュールがあったとします。このコードは安全でしょうか。したら別物になってしまっている可能性があります。モジュールが最初に実行されるタイミングではグローバルやプロトタイプが変更されていないという前提のもとでは以下のようなコードの方が安全と言えるでしょう。プロトタイプの利点を完全に失ってしまっているコードで馬鹿馬鹿しいと思ったかもしれません。ライブラリの中にはこのように安全側に倒して実装されているものもあります。それにあたります[3]。!アプリケーション開発においてこのようなコードを書くのは現実的ではありません。厳密な実装を第一としているライブラリでは、ビルトインオブジェクトのグローバル変数やプロトタイプが変更されたとしても問題なく動くように工夫されていると知ってもらえたらそれでいいと思います。https://github.com/ljharb/proposal-get-intrinsicこの提案はあくまで補助的なものであって、将来的にはプロトタイプの変更に対しては別のアプローチを取るべきだとしています。いうものが存在し、これを使うことでありとあらゆるグローバル変数やビルトインオブジェクトのプロトタイププロパティの変更に耐えられるように実装されています。https://github.com/nodejs/node/blob/e937662dec4adc6ac1cd65afd4cbda79703d5ecc/lib/internal/per_context/primordials.js先程のコード例を見ただけだとプロトタイプメソッドをモジュールのスコープに変数としてキャッシュしておいて、函数実行時にそっちを使えばそれだけで解決すると思うかもしれませんが、そんなに単純ではありません。以下のコードは安全でしょうか。メソッドを使う仕様になっています。変更すれば簡単に挙動を変えることが出来てしまいます。メソッドが実行されてしまうことも考慮するべきでしょう。クラスを用意することで対応されています。仕様を眺めるのが好きな人からすると結構面白いです。考慮しなければならないなどの学びがあります。将来的にどうなるのか今後もグローバル変数やプロトタイプの変更に耐えられるコードを書くためにこのように仕様を完全に把握し、エクストリームなコードを書くことを強制され続けてしまうのでしょうか。パッケージに悪意のあるコードが混入したりとセキュリティの問題が大きくなってきています。対処法はないのでしょうか。オプションがあります。ビルトインオブジェクトを凍結することが出来ます。使用できないようです)。実装は以下にあります。こちらもビルトインオブジェクトを凍結することが出来ます。同じことが実現できます。呼び出す運用になるのかなと思います[4]。以下のようなブートストラップモジュールを用意しエントリーポイントの最初に読み込むと、他の依存パッケージで悪さができなくなるため良いかなと思います。凍結するlockdown();ライブラリ開発者からするとビルトインオブジェクトを凍結するのは影響範囲が大きいため使えませんが、アプリケーション開発者の立場からするとこの提案はかなり嬉しいものだと思います。この提案をしている方たちによる実験的なライブラリが公開されています。ように明示的に権限を与えなければならないといった実行環境側の話もあります[5][6]が、言語仕様側でも議論されています。みなさんもこのあたりを追ってみてはいかがでしょうか。生まれたと言われています。以外でプロトタイプを拡張するのは設計ミスだと記述されています。そのように実装しました。エンジンがその存在を認知できないため一筋縄ではいかない問題がありそうです。オプションでパーミッションを明示的に指定する必要があります。明示的に与えてあげる必要があります。作者バッジを贈って著者を応援しようバッジを受け取った著者にはZennから現金やAmazonギフト券が還元されます。ディスカッションで提案しました。ECMAScript結びZennエンジニアのための情報共有コミュニティAboutZennについて運営会社お知らせ・リリースGuides使い方Publicationよくある質問LinksTwitterGitHubメディアキットLegal利用規約プライバシーポリシ。