blog

JavaScript王国への旅、クラスのない世界でオブジェクト指向をどう遊ぶか?

将来のJava帝国の後継者として、Javaのリトルプリンスは厳しい教育を受けてきました。Java言語、Java仮想マシン、Javaクラスライブラリ、フレームワークに精通しているだけでなく、Javaの公...

Jul 15, 2020 · 8 min. read
シェア

前書き

将来のJava帝国の後継者として、Javaのリトル・プリンスは厳しい教育を受け、Java言語、Java仮想マシン、Javaクラス・ライブラリ、フレームワーク、そしてさまざまなJava公式仕様に精通しています。

最近、Javascriptという負け犬が独立王国の建設に成功し、フロントエンド・プログラミングの王者となっただけでなく、Java帝国の領土を侵食し続けているという話を聞きました!

裁判所の先生の文の小さな王子によると:過去にさかのぼって考えて、この男は唯一のブラウザで実行されている、完全にJavaのこの開発の熱をこすり、今もいじめに戻って、正義はありませんか?これは許容することができますか?

小さな王子はそう思いません、存在は合理的でなければなりません、javascripはユニークでなければなりません、諺にもあるように、敵を知り、自分を知り、危険にさらされることはありません、彼は、ブラウザーでこのかつてオブジェクト指向言語が何であるかを確認するために、いくつかの知性を収集し、周りを突くためにJavascriptの王国に行く必要性を感じた、なぜこれほど多くのコーダーが殺到する傾向があります。

最初の印象

着飾った後、若い王子が到着したジャヴァスクリプト王国は、ジャワ帝国の真面目で厳格な雰囲気とは異なり、人々がのびのびと自由奔放で、活気に満ちているように見え、人々を幸せな気分にさせます。

私が驚いたのは、ここには公式ライブラリが存在しないことです! AngularJS、React、Backbone、Vue、Ember、JQuery、......などなど。 そして、自分たちの間で口論が絶えません。

対照的に、Java帝国は、巨大なクラスライブラリの公式プロビジョニングと、厳格なルールを持って、支配的なWebフレームワークSSH / SSMに加えて、Javaの仕様の様々な、コード農家は、単にライン上で動作し、学ぶために持参する必要があります。

選択肢がなくなるということは、選択肢が減るということ。王子自身にもわかりません。

小さな王子はまた、Javascript王国の人々はプログラムを書くのにIDEをほとんど使わず、手軽なテキストエディタを見つけて作業を開始し、それをブラウザに放り込んでテストを実行するだけなので、本当に軽量であることにも気づきました!残念なことに、Java帝国はまだIntelliJ IDEAとEclipseの優劣について議論しています。

3つ目は、クラスなしでオブジェクトを作成する方法です。

さらに調べるうちに、小王子はクラスという概念がないことにますます驚きます!オブジェクト指向言語にはクラスがないのです!これは、幼い王子が生まれたときから植えつけられてきた概念に反しています!

クラスなしでオブジェクトを作るには?私が子供の頃、宮廷の先生はよくこう言っていました。

しかし、私たちの目の前には無数のjavascriptオブジェクトがあり、それらは常に創造され、破壊され、巨大で活気に満ちた帝国を支えるために懸命に協力しています。

これらのオブジェクトはどこから来たの?小さな王子は困惑していました。ちょうど正午、小さな王子は目の前にJSONの居酒屋を見つけ、まず立ち寄っておいしい食事をすることにしました。

若い王子は、牛肉の煮込み2カティとワイン3杯を注文し、それらを楽しみ始めようとしたとき、隣のテーブルのローブの男が、「ねえ、あなたが話している物体の原型は何?

もう一人の眼鏡をかけた男が、「シー、静かに、国王が、この試作法は帝国の秘密であり、ジャワ帝国に知られた場合に備えて、公の場で議論することを禁ずるという命令を出したところです」とささやきました。

relationresult小 王子の心が動いて、すぐに2番目を呼んで、最高の料理とワインを頼んで、隣のテーブルに送って、2人を招いてワインを食べました。一杯を飲み干すと、小王子はようやく二人の最初の信頼を得て、それは彼らがまた、javscript言語仕様の関係者を見直す責任があることが判明しました。

我が家は代々商売を営んでおり、世界中を旅してきました。 C++の王国、Javaの帝国、C#の帝国に行きましたが、どれもオブジェクト指向言語であると主張しており、クラスとオブジェクトの区別があります。"

眼鏡をかけた警官は、"クラスはありません、直感的でなさすぎです!"と言います。

小王子は驚いていましたが、よくよく考えてみると、Javaを習いたての頃、クラスという概念を受け入れるのにかなり苦労したような気がします。実際、オブジェクト指向システムって、オブジェクト同士の相互作用だけじゃないの?何のためにクラスが必要なのか?

そして、小さな王子は重要な質問をします。"クラスなしでどうやってオブジェクトを作るのですか?"

「オブジェクトとは何か、考えてみてください。 オブジェクトを作るためにこれを見るんだ」:

ほら、この動物オブジェクトはプロパティ名とメソッドを定義しているでしょ。

単純明快で、クラスをまったく必要としないオブジェクトが作成され、若い王子の前に新しい扉が開かれたようです。「オブジェクトはクラスに関連付けられていないので、オブジェクトに自由に属性を追加することができます。

"まだこんな風に遊べるの?" 若い王子は唖然としました。クラスの制約がなければ、これらのオブジェクトはあまりにも自由でした。

IV.クラスなしで継承するには?

「継承はオブジェクト指向の重要な概念です!javascript王国では、各オブジェクトはprotoと呼ばれる特別な属性を持っていて、この属性を使って別のオブジェクトを関連付けることができます。

この飲み物に書かれた暗号は長くはありませんが、アルケタイプの秘密が隠された膨大な情報が含まれているため、小さな王子は衝撃を受け、深く考えずにはいられませんでした:

犬の原型は動物であり、猫の原型も動物です。

dogにもcatにもeat()メソッドは定義されていません。

eatメソッドが呼ばれたら、まず自分のメソッドリストから探し、見つからなければプロトタイプから探し、プロトタイプで見つからなければプロトタイプのプロトタイプから探します。 プロトタイプで見つからなければ、プロトタイプのプロトタイプを探し、そしてオブジェクトを探します。

これらのオブジェクトは、プロトを通じてプロトタイプ・チェーンを作っているはずです!

そういえば、師匠がJVMの仮想マシンについて教えてくれたとき、オブジェクトがメソッドを実行するとき、メソッドの定義を調べる必要があり、その順番もオブジェクトが属するクラスから始まり、次に親クラス、そして親クラスの親......ということも言っていました。 オブジェクトまで、考え方はまったく同じです!

Javaのメソッドはクラスの中で定義されていますが、このjavascriptのメソッドはオブジェクトの中にあります。

プロパティとメソッドは、プロトタイプ・チェインを見上げれば同じようなものであるはずですが、ここではdogのname属性がanimalのname属性をオーバーライドしているようです。また、dog.eat()を呼び出すときの thisは、dogというオブジェクトを指しているはずです。

オブジェクト指向のコンセプトはすべて理解できたようです」。そう考えると、リトル・プリンスの顔には笑みが浮かんできました。

どうしたんだ、外国人?どうしたんだい、外国人?」。小さな王子は自分が要領を得ないことに気づき、「ああ、何でもありません。あなたが使っているこの "プロトタイプ "はとても賢いと思います。

メガネの関係者は凍結:"外国人、それはあなたが良い理解を持っているようだが、帝国の秘密はあなたの洞察力であったが、多くの新しいプログラマは、これを理解することは容易ではないので、javascriptは、Javaの新しいオブジェクトのようにすることができるように、修正を加えました。私はそれがすべてのC + +、Java、C#プログラマに対応するためだと言うことを恥ずかしい "

Javaに近づく

王子「どんな回避策?君たちもクラスを使うようになったの?「いいえ、コンストラクタというものが用意されています。と言って、飲み物を飲みながらまた書き始めました:

小さな王子は言いました。"あの関数はもうちょっとしたクラスだよ。頼むよ、thisというキーワードを見るなんて。ところで、スチューデントをわざと大文字にしたのかい?"

"ええ、これだとJavaクラスのように見えますね。でも、真ん中に問題があるんです。"

新しく作られたオブジェクトはすべてsayHello関数を持っているということではないのでしょうか?Javaでは、関数はクラス上で定義されます。もしオブジェクトに定義されているのなら、すべてのオブジェクトがコピーを持っていることになり、もったいないですね。"

「このsayHello関数を別の場所に置く、より効率的な方法を提供しなければなりません。 「どこに? "プロトタイプ・チェーンについて言われたことを覚えていますか?オブジェクトがメソッドを呼び出すと、そのメソッドは連鎖していきます。ですから、sayHello関数を含むプロトタイプオブジェクトを作成し、andy、lisa、そしてStudentから作成された他の全てのオブジェクトがそのプロトタイプを指すようにすることができます。"

"でも、Studentはコンストラクタしか持っていないけど、プロトタイプ・オブジェクトはどこで作るの?andyやlisaなどのプロトタイプをどうやってプロトタイプオブジェクトに指定するのですか?手動で指定する必要はないでしょう。"

きっとジャバスクリプト帝国はプログラマーをそんなに悩ませないでしょう。Student.prototype属性にプロトタイプオブジェクトを入れれば、andyやlisaのようなオブジェクトを作るたびに、ジャバスクリプトが自動的にプロトタイプチェーンを構築してくれるでしょう!andyやlisaのようなオブジェクトを作成するたびに、javascriptが自動的にプロトタイプチェーンを構築します。"

小さな王子は顔を赤らめ、「うっ、それはちょっと理解しにくいですね」。 "絵を描いた方がいいかもしれませんね。新しいStudentに行くと、javascriptは次のような関係の連鎖を作ります。"

小さな王子は言った: "私は、このいわゆるコンストラクタStudentは、実際にはフロントああであり、あなたが新しいStudentに行くたびに、確かに(アンディまたはリサ)からオブジェクトを作成し、このオブジェクトのプロトタイプは、Student.prototypeこのオブジェクトに、あなたはsayHello()メソッドを見つけることができます。sayHello()メソッドを見つける"

メガネの士官はこう答えました。"そうですね、ここで紛らわしいのはプロトとプロトタイプの属性です......残念ですが、なぜ初期にそうされたのかはわかりません......ただエレガントではないのです"

「このコンストラクタとプロトタイプの概念は本当に不可解です。 と、ローブ姿の関係者。

構文シュガー

というのも、Javaにもプログラマーにやさしい構文解析がたくさんあるからです。 ローブを着た役人がjavascript用の構文解析を書き出したとき、小さな王子は驚きました:

この構文糖によって、javascriptはJava、C#、C++のクラスと非常によく似ています。 javascript帝国はプログラマーを「喜ばせる」ために懸命に変わろうとしているようですが、java帝国はより懸命に変わろうとしているようです。

Javascriptはプロトタイプに基づくオブジェクト指向言語であり、クラスという概念は一切存在しないことを若王子は理解しました。 この新しい考え方は若王子の考え方に大きな影響を与えました。

ここに長く滞在しているうちに、javascriptの強力な関数型プログラミングについて学び、ますますjavascriptが好きになり、少し夢中になりました。

リトル・プリンスはジャワ帝国に戻れるのか?

Read next

ReactNativeとiOSネイティブ通信原則分析-通信編

本記事では、上記2つの記事を踏まえて、引き続きRNとiOSネイティブの通信の仕組みを理解していきます。 免責事項:この記事で使用しているrnのバージョンは0.63.0です。前回の記事を読んでいただければ、jsコードを実行した後にJSIExe...

Jul 15, 2020 · 14 min read