web-dev-qa-db-ja.com

プロトタイプベースの言語であるjavascriptにプロトタイプにアクセスする簡単な方法がないのはなぜですか?

これは愚かな質問かもしれませんが、私はちょっと興味をそそられます。

JavaScriptはプロトタイプベースの言語であり、疑似クラスの関数コンストラクターは半分焼き上げられています( JavaScript:The Good Parts ...を思い出してください)。それがなかったのはどうしてでしょうか。最初から、各オブジェクトのプロトタイプにアクセスする簡単な方法。

簡単に言うと、object.prototypeやobject._prototype(ダーティプロトではない)のようなものです

私の知る限り、Object.getPrototypeOf(obj)は、JavaScriptがリリースされてからほぼ13年後の2008年後半に追加されたばかりです。

これは、JavaScriptが純粋なプロトタイプベースの言語として使用されることを意図していたのか、つまり、関数を使用してオブジェクトを構築することなく(つまり、new演算子を使用しないで)常に疑問に思っていたためです。

6
opensas

Object.createを調べて、クロージャーを介してカプセル化されたインスタンス変数を提供するため、私が実際に非常に役立つ関数コンストラクターの代替を探します。

どれくらいの期間利用できるかわかりませんが、しばらくの間<object> .constructor.prototypeを使用しています。

しかし、実際には、JSは10日で作成されました。それ以来、それはそのラッシュの仕事から進化しています。最初にリリースされたときに、関数コンストラクターのプロトタイプがあったかどうかさえわかりません。 Netscapeの真ちゅうは、Javaのように見せたいと考えていました。 Brendan Eichは、Schemeのように動作させたいと考えていました(そして、それをJavaではなくCのように見せることに決めました。

また、Good Partsはまともな読み物ですが、それは最終的な権威ではありません。Crockfordは、この言語について本当に奇妙なハングアップをいくつか持っています。特に、彼が主張している関数コンストラクターは、新しいキーワードの使用を忘れて失敗する可能性があるため、不適切です。まあ、朝もズボンを忘れることがあるかもしれませんが、すぐに気付く傾向があります。

これを見つけるために少し時間をかけましたが、どうしてそれが起こったのかを本当に知りたいのであれば、馬の口に行くのが最善です:

https://brendaneich.com/2008/04/popularity/

9
Erik Reppen

これは、Eichが言語を設計したときに何を頭に入れたかについての質問なので、答えることができるのは本当に彼だけです。

しかし、私が推測に挑戦する必要がある場合、JavaScriptの初期バージョンは迅速かつ汚いプロトタイプであり、彼は後続のリリースで不整合や欠落している機能を解決できると期待していました。しかし、それはすぐにMicrosoftによってバグとバグの互換性を備えたリバースエンジニアリングが行われ、標準化されたため、予想よりも早く言語がフリーズしました。

Javaのように「新規」でインスタンスを作成することが意図されていたと確信しています。継承はプロトタイプを介して行われた「内部」の実装の詳細でした。キーワード 'extends'および 'implements'は最初から予約されていました。これは、言語が継承のためによりJavaに似た構文を開発することが期待されたことを示唆しています。しかしそれまでは、継承を使用するためにプロトタイプを直接変更する必要がありました。

したがって、現在の状況は半分焼き尽くされたものであり、意図的な設計決定の結果ではありません。

0
JacquesB