• ベストアンサー

オブジェクトがわからない

オブジェクトが設計図やそのによって作られた物であるというのはわかったのですが、 下記のように深くなると初心者には難しくてわかりません。 初心者にもわかるように解説していただけるとありがたいです。 >>> オブジェクトとは、単に名前がついた入れ物の集合ではありません。オブジェクト自体が1つのモノであり、中に含まれる要素は、このモノの特性や動作を表すために存在します。要は、(連想配列ではなく)「オブジェクト」という言葉を使う場合には、主役は個々の要素ではなく、オブジェクト(モノ)そのものであるといったらよいでしょうか。 JS本格入門より

質問者が選んだベストアンサー

  • ベストアンサー
  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.9

オブジェクトは添字に文字列しか使えません(厳密に言うと、ES2015以降ではシンボル型も使えますが、当分は無視してください) 数値も使えるように見えますが、それは文字列化されて使われているだけです。

noname#226032
質問者

お礼

文字列しか使えないのがオブジェクトの特徴のようですね。

その他の回答 (11)

回答No.12

>もしオブジェクト指向プログラミングを勉強したいのなら、(JavaScriptのオブジェクト指向プログラミングは特殊なので)Javaで勉強する方が良いと思います。 蛇足ですが、下記はJavaアプレットです(笑)。 下記はJARに圧縮してないclassファイル群のアプレットです、JARに圧縮してないので効率が悪いので表示に少々 時間がかかる場合があります。 どうもclassファイルをJARに圧縮するとアプレットが表示できなくなるようだ(^_^;JARファイルは電子署名でも付けろと言う事だろうか?) http://pleiades1335.x1xhosting.com/museum/myapplet/Figure0K/AppFigure0K.htm セキュリティーの強化によりアプレットに電子署名を付けるか、またはユーザーが下記の設定をしないとアプレットが表示できなくなりました。 WebブラウザでJavaを有効にするには https://java.com/ja/download/help/enable_browser.xml Java「セキュリティ設定によってブロックされたアプリケーション」の解除方法 http://www.geocities.co.jp/Playtown-Yoyo/6130/notes/virus-java-security.htm 例外サイト・リストに このサイトのトップ・アドレスの「http://pleiades1335.x1xhosting.com/」を設定して下さい。

回答No.11

>もし、趣味でプログラミングしてみたいなら Android Java がオススメです、Android 端末さえあれば自分の作ったプログラムを人に見せびらかせられるので >Android プログラミングの基本の基本 >http://ashtarte.hotcom-web.com/utf8/smt.cgi?r+sara/&bid+00000047&tsn+00000047-& 中々プレイしやすいテトリスが無いので自分で作ってみる。 ちなみに「Tetris(R)」は登録商標「(R)」になっているようなので、名前は「Tetraz」としています。 Android Tetraz 017 http://ashtarte.hotcom-web.com/utf8/smt.cgi?r+sara/&bid+00000002&tsn+00000002&

回答No.10

もしオブジェクト指向プログラミングを勉強したいのなら、(JavaScriptのオブジェクト指向プログラミングは特殊なので)Javaで勉強する方が良いと思います。 もし、趣味でプログラミングしてみたいなら Android Java がオススメです、Android 端末さえあれば自分の作ったプログラムを人に見せびらかせられるのでモチベーションが上がるんじゃないでしょうか? ただし、みんなが普段 使ってるような「アプリ、ゲーム」などと比べて雲泥の差でショボイので、あまり良い反応は得られない場合が多々あるかもしれませんけど…。 Android Java は基本的に通常の Java と互換性がありますが違う部分もあるので注意が必要です、又 通常の Java と API が全く別物です。 Android プログラミングの基本の基本 http://ashtarte.hotcom-web.com/utf8/smt.cgi?r+sara/&bid+00000047&tsn+00000047-&

noname#226032
質問者

お礼

今ES6でやっていますがそれでもjsはあいかわらずひどい構文なのですね。

回答No.8

★クラス(設計図)からインスタンス(実体)を量産できる。 分かりやすく生物で例えるとDNAを再利用してクローン(複製)を量産できる(この場合 、オブジェクトからオブジェクトをクローニングすると言う意味ではありません。) ★クラスを継承し機能を拡張できる。 この場合、当然ゼロから作るのではなく継承元のクラスを活用する事ができるので、その分 労力の削減でき、手間が少なくなるので その分 プログラミング上のヒューマン・エラーも多少 減らせます。 ★ラップ(分かりやすく例えるとプラグイン)によるオブジェクトの再利用。 様々なオブジェクトを乗せ変えて活用させる事ができます(実際の PC で分かりやすく例えるなら高性能グラフィック・ボードを挿す、高音質サウンド・ボードを挿す、高速LANボードを挿す、みたいな感じで機能を拡張できる)。 ★オブジェクト志向プログラミングのデメリットは肥大化です。 つまり、上記のように再利用できないモノはオブジェクト化のメリットがなく、デメリットだけだと言って良い程です。 下記 画像は自動車部品のモジュール化(自動車部品の共通化)により、労力(開発コスト)の削減を実現していますが、これがオブジェクトの継承に対応します(この場合 多重継承になってしまってますが…)。 現存する利用可能なクラスを継承すれば労力を削減でき、その分 ヒューマン・エラーも多少 削減できます。

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.7

「連想配列」とは一般的な言葉で、添字に数値以外が使える配列のことです。 言語によっては、「連想配列」という具体的な機能が存在することもありますが、JSにはありません。 ただし、JSではオブジェクトの自由度が高いので、一般的な連想配列の機能も併せ持ちます。 実は多くの他の言語での「オブジェクト」というものは、後からあまり自由に値を書き加えたりできないものなのです。 その場合に、自由に書き換えることができる機能として、「連想配列」というものがあったりします。 JSのオブジェクトはそう言った多くの他の言語の常識から見ると、「連想配列」にも見えるということです。 ただし、JSのオブジェクトはキーに文字列しか取れない、限定された連想配列です。 キーに文字列以外が取れる連想配列もあり、JSの新バージョン含むモダンな言語ではコレクションと言われたりする機能が存在し、「連想配列」の機能を使いたい場合は主にそちらが推奨されます。 そして、オブジェクト指向とは、そこら中に散らばっている関数にデータを与えて行くのではなく、 関数が関連付けられたデータのまとまりに対して指示することでまとまりをよくする手法です。 簡単に言うと、 Xネームスペースにまとめた関数を使って、 X.C( X.B( X.A( x ) ) ) と書くのではなく、 xに紐付ける仕組みを使って x.A().B().C() と書こうよということです。 そして、AやBやC、それからxを作るためのコンストラクタを一纏めに記述できる仕組みを使ってコードを整理できます。

noname#226032
質問者

お礼

「連想配列」とは一般的な言葉で、添字に数値以外が使える配列のことです。 JSは他の言語とちがいアバウトなので、オブジェクトの一種に連想配列があるという極めて異例な言語なのですね。 オブジェクトはすると添え字に文字列も、数列もどちらも使えるということなのでしょうか?

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.6

まず、オブジェクトとは、単に名前がついた入れ物の集合と考えてください。 「単に名前がついた入れ物の集合」というのがどのようなもの何か分かりますか? 一つの値に一つの名前を付けたペアの集まりです。 配列で言う、0番目、1番目、の代わりに文字列の名前を付けることができるのです。 オブジェクトに対して名前を使ってその値を得たりすることができます。 それを連想配列と言い、オブジェクトとは連想配列でもあるのです。 ただし、JSのオブジェクトの持つもう一つの性質を活用した場合は、 ただの連想配列よりも高度なことができます。 JSのオブジェクトは、「プロトタイプ」と言われる、自分自身の親のオブジェクトを持つ事ができます。 JSのオブジェクトに名前を使って問い合わせた時に、もしそのオブジェクトにペアがなければ、親のオブジェクトに問い合わせがリダイレクトされます。 これによって、コードの無駄を省くためにfor文や関数を作るのと同じような感じで、共通する要素をまとめて構造化をすることが出来るのです。 そして、構造化ができると、もう一つ大事なことがあります。それは、メソッドの存在です。 オブジェクトはしばしば、数値や文字列と言ったデータの他に、それらを利用・加工する関数を持ちます。 例えば、学校クラスの名前と身長のペアの集合があったら、その身長の平均を求める処理が考えられます。 その関数も、適当な名前を付けてオブジェクトに他のデータと一緒に入れておくわけです。 そうすることで処理とデータが分離されず、利用する際のまとまりが良くなり、コードの見通しも良くなるのです。 ここで、学校のクラスは1つではないことを思い出してみましょう。 学校には沢山のクラスがあります。しかし、そのオブジェクト全てにそれぞれ身長の平均を求める関数をもたせるのは無駄ですよね。 そこで、関数を別のオブジェクトに分離して、データだけが入った各クラスのオブジェクトの親に設定します。 もう分かりましたか?このように、モノに対して処理の詰まったオブジェクトを用意しておいて、その子としてデータの詰まったオブジェクト(モノ)を作り出していくのが、JSにおけるプロトタイプベースオブジェクト指向プログラミングです。 実際にはこの仕組は影で行われていることが多いので、イメージしにくいかもしれませんが、new演算子を使った場合などに働くことになります

noname#226032
質問者

お礼

難しいですね。 ありがたいです。 オブジェクトの一種に連想配列があるのですか? それとも完全にイコールなのでしょうか? >> そして、構造化ができると、もう一つ大事なことがあります。それは、メソッドの存在です。 オブジェクトはしばしば、数値や文字列と言ったデータの他に、それらを利用・加工する関数を持ちます。 例えば、学校クラスの名前と身長のペアの集合があったら、その身長の平均を求める処理が考えられます。 その関数も、適当な名前を付けてオブジェクトに他のデータと一緒に入れておくわけです。 そうすることで処理とデータが分離されず、利用する際のまとまりが良くなり、コードの見通しも良くなるのです。 ここで、学校のクラスは1つではないことを思い出してみましょう。 学校には沢山のクラスがあります。しかし、そのオブジェクト全てにそれぞれ身長の平均を求める関数をもたせるのは無駄ですよね。 そこで、関数を別のオブジェクトに分離して、データだけが入った各クラスのオブジェクトの親に設定します。 こちらは生徒一つ一つにメソッドを当てるとソースが汚くなるので、生徒をクラスオブジェクトでまとめて、 そのクラスオブジェクトに関数を一個だけ当てればすべての生徒に充てたのと同じ結果が得られるので、 オブジェクトでまとめたほうがソースがきれいということでしょうか? ()でまとめるようなイメージですかね。

回答No.5

>クラスの継承は機能の拡張なので 機能拡張と言われてももピンと来ないかもしれませんね。 分かりやすく例えるとPCの拡張スロットに様々な拡張ボードを追加して、PCの機能を拡張するイメージです。

回答No.4

シロウト向けに 本当にザックリと説明すると (クラスの継承は機能の拡張なので、実際の意味合いは違いますが、分かりやすく例えるなら)クラスの継承は系統樹のようなイメージです。 添付画像の名前が付いてる部分がクラスに対応します。

回答No.3

「オブジェクト指向」と「オブジェクト」を混同してませんか? オブジェクト指向的な考え方は、いわゆるクロージャー的な書き方で代用できるのだし それを必要とせずにコードを書けて、プロとして儲けられるのであれば好いと思います。

  • akauntook
  • ベストアンサー率19% (295/1481)
回答No.2

専門家に質問してみよう