インスタンスオブジェクトとは何かについて教えて!

このQ&Aのポイント
  • インスタンスオブジェクトとは、オブジェクトを作成するために使用されるnew演算子によって生成されるオブジェクトのことです。
  • new演算子は、メモリ上に記憶場所を確保し、そのポインタを返す演算子です。この返されたポインタは、新しく作成されたオブジェクトを指し示します。
  • インスタンスオブジェクトは、作成されたオブジェクトの実体であり、それにアクセスするためには変数に割り当てる必要があります。
回答を見る
  • ベストアンサー

インスタンスオブジェクトとは何かについて教えて!!

下記内容はあるサイトのインスタンスについての説明文です。 画像は、自分なりに理解したものです。 (1)メモリ上には記憶場所(=ポインタ)はない (2)var Aa = new Bb("13" , "smole");とscript内に追加されたことにより メモリ上に記憶場所(=ポインタ)が作成され、 BbオブジェクトつまりBb("13" , "smole");がその記憶場所(=ポインタ)に入る (3)そしてBb("13" , "smole");が入った 記憶場所(=ポインタ)にAaという名前を付ける。 考え方に間違いがあるでしょうか? ---------------------------------------------------- var Aa = new Bb("13" , "smole"); これは、BbクラスオブジェクトのBbコンストラクタをnew演算子を利用して起動しています。 new演算子は、メモリ上に記憶場所を確保して、Bbオブジェクトを作成した後、そのポインタを返す演算子です。 new演算子から返されたポインタは、Aaへ格納されます。この場合のAaをBbオブジェクトのインスタンスといいます。 また、new演算子でメモリ上に記憶場所を確保して作られたオブジェクトをインスタンスオブジェクトといいます。 つまり、 オブジェクト == インスタンスオブジェクト で、 インスタンス != インスタンスオブジェクト インスタンス != オブジェクト です。 ----------------------------------------------------

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

  • ベストアンサー
  • Chaire
  • ベストアンサー率60% (79/130)
回答No.2

> 考え方に間違いがあるでしょうか? そもそも JavaScript に「ポインタ」はありません。「JavaScript はどういう言語」かという言語規格の話と、「JavaScript エンジンがどのように作られているか」という実装の話がごっちゃになっています。JavaScript オブジェクトがポインタとして実装されているかは、利用者には何の関係もないことです。 JavaScript におけるオブジェクトとは、プロパティの集合です。例えば、下のような変数があるとします。 var a = 1, b = 2, c = 3; これらをひとまとめにしておくと便利、という時があります。そこで「オブジェクト」にくっつけてしまいます。 var o = { }; o.a = 1; o.b = 2; o.c = 3; // または、var o = { a:1, b:2, c:3 }; と一気に書いても良い こうすれば、a, b, c を持ち運ぶとき(例えば関数の引数・戻り値として)、o という 1 個のオブジェクトを受け渡しするだけで a, b, c も全部くっついてきます。このとき、a, b, c はオブジェクト o の「プロパティ」である、と言います。 プロパティには何でも代入できます。別のオブジェクトを代入しても構いません。 o.d = { x:4, y:5 }; o.d.x; // 4 o.d.y; // 5 JavaScript における「オブジェクト」は「プロパティ」を束ねるものです。それ以上でも以下でもありません。 --- JavaScript における new 演算子の役割は、ポインタ云々ではなく、プロトタイプチェーンをつなぐことです。ですが、そもそも「オブジェクトって何?」という段階で new を気にする必要などありません。まず、上に書いたオブジェクトの使い方に慣れて下さい。 > オブジェクト == インスタンスオブジェクト > インスタンス != インスタンスオブジェクト > インスタンス != オブジェクト いいえ。JavaScript では、 オブジェクト=インスタンスオブジェクト=インスタンス 関数=関数オブジェクト=関数インスタンス=コンストラクタ=コンストラクタオブジェクト です。ですから、JavaScript の理解すら覚束ない段階でオブジェクト指向の用語を振り回すのは、かえって JavaScript の理解を妨げると思います。 ※ECMAScript 規格書ですら、「Array オブジェクト」が Array のインスタンスなのか、Array コンストラクタ自身(これは Function のインスタンスでもあり、Object のインスタンスでもあります)を指すのか曖昧です。だいたい、instanceof 演算子があるにもかかわらず、「インスタンス」の定義は ECMAScript 規格にありません。

tekkenman7
質問者

お礼

とても参考になりました。 ありがとうございました。

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

ここらへんを見ています? http://chaichan.web.infoseek.co.jp/src/javascnew03.htm >考え方に間違いがあるでしょうか? まああっているかと。 > オブジェクト == インスタンスオブジェクト > インスタンス != インスタンスオブジェクト > インスタンス != オブジェクト ちょいと意味不明かと。何を説明したいのでしょうか。 上記URLのだと、Number型とかの話が続きますが、ちょっと説明がおかしいというか不十分だと思います。 インスタンスだとかオブジェクトだとかの用語は、C++やJava、Smalltalkなど、別言語の用語と混用されたりするので、あんまり厳密にとらえないほうがよいかと。 逆に、さも厳密っぽいものとして使っちゃうと、世のプログラミング言語論者から、非常(非情)なる指摘を受けることになりかねないです。 厳密に覚えるなら、ECMaScriptの仕様書とかを読んだほうが良いと思います。

tekkenman7
質問者

お礼

ありがとうございます。 これは具体的に知らなくても問題ないのですね。 きをつけます。

関連するQ&A

  • javascriptのObject()コンストラクタについて質問です。

    javascriptのObject()コンストラクタについて質問です。 var obj = new Object(); var obj2 = Object(); console.log(obj === obj2)//false いつも質問ばかり恐縮です。。。 どこかのサイトでこの2つは等価みたいな記事を読んだような気がするのですが、 ということはObjectコンストラクタでオブジェクトを作る際はnew演算子は要らない?? のでしょうか?? またobjとobj2の2つの違いを色々試したのですが違いがわかりません。new演算子を 付けたインスタンスと付けないインスタンス??の違いをどなたか ご教授いただけると助かります。

  • javascriptを只今勉強中なのですが、オブジェクトについてこんが

    javascriptを只今勉強中なのですが、オブジェクトについてこんがらがってしまいました。 var obj = new Object(); var obj2 = {}; Object.prototype.prop1 = "hoge"; obj,obj2共にprop1にhogeがセットされるのですが、オブジェクトリテラルのobj2は Objectコンストラクタのインスタンスと解釈できるのでしょうか?? new演算子について色々とfirebugで調べていたところこの疑問が出てきました。 newなしでもインスタンスができるのでしょうか? オブジェクトを理解していないので意味不明な質問かもしれませんが どなたかアドバイスいただけると嬉しいです。

  • php インスタンスとオブジェクトの呼び方

    new obj = new Test(); という一文は、 「Testクラスのオブジェクト、objを作成している」という考えを持っています。 オブジェクトは物という概念で、 「Testクラス を new して、objインスタンスを作成している」 というのが正しいのでしょうか? 【objを Testオブジェクトと呼ぶのは間違っているのでしょうか? objは Testインスタンスと呼ぶのがやはり正しいのでしょうか?】 知り合いにも、インスタンスではなくオブジェクトと呼んでる人が多いのでわからなくなってきました。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • オブジェクトとインスタンスはそれぞれあってますか?

    オブジェクトとインスタンスはそれぞれあってますか? vbaで Sub test() Dim CN As ADODB.Connection 【1】 Set CN = New ADODB.Connection  【2】 ・・・ それぞれ 【1】オブジェクトの作成 【2】インスタンスの作成 であってますか?逆ですか? 動作の名称を教えてください。

  • インスタンス生成について

    いつもお世話になっております。 今回はインスタンス生成について質問させて下さい。 String クラスのインスタンス生成は、 String str1 = new String(); のように明示的に new 演算子を用いる方法と、 String str2 = "hoge"; のように生成する方法がありますよね。 str2 の方は、JVM が(?) 勝手にコンストラクタを呼び出してくれて、 インスタンスを生成してくれる、という認識でよいのでしょうか? また、明示的に「 new 演算子 + コンストラクタ」でインスタンスを生成する場合と、 そうでない場合の使い分けなどはあるのでしょうか? そもそも String 以外に、このような複数のパターンでインスタンスを生成することができる クラスは他にもあるのでしょうか? 以上、ご教授宜しくお願い致します。

    • ベストアンサー
    • Java
  • インスタンス

    String s1 = new String(str1.getBytes("8859_1"), "x-euc-jp"); s1 = new String(str2.getBytes("8859_1"), "x-euc-jp"); s1 = new String(str3.getBytes("8859_1"), "x-euc-jp"); のように同じ変数にたいして new演算子で新たにインスタンスを確保した際 前に確保したインスタンスは開放されているのでしょうか? 基礎的な質問かと思いますが宜しくお願い致します。

    • ベストアンサー
    • Java
  • 二段階でインスタンス化する必要、メリットって何?

    JAVAについての質問です。 オブジェクトを宣言しても、NEWしない(インスタンス化しない)とメモリにはその領域が確保されないと参考書には 書かれていますが、このようにわざわざ二段階にわけてインスタンス化する必要、メリットって一体何なんでしょうか。 確かにインスタンス化されるまでは、メモリの節約にはなるでしょうが、宣言とインスタンス化する時間的なズレは わずかなもので、増してPCにとっては、もっと大した時間ではないでしょう。 それほどまでにしても、メモリの節約が大事なのでしょうか。 このように二段階にする意味は他に何か理由はあるような気がして仕方ないのですが。 このような疑問を持つのは私だけでしょうか。

    • ベストアンサー
    • Java
  • ユーザー定義オブジェクト

    現在、ユーザー定義オブジェクトについて勉強しています。 以下は本からの抜粋です。 //コンストラクタを定義する。 //thisで参照するオブジェクトの初期化法に注目   function Rectangle(w,h) { this.width=w; this.height=h; } //コンストラクタを呼び出して2つの長方形オブジェクトを生成する。 //widthとheightをコンストラクタに渡して、それぞれの新しい //オブジェクトを適切な形で初期化するやり方に注目 var rect1=new Rectangle(2,4); var rect2=new Rectangle(8.5,11); ★質問★ this.width=w; this.height=h; var rect1=new Rectangle(2,4); var rect2=new Rectangle(8.5,11); この2箇所で行っている「初期化」という作業の意味がよく分かりません。 また、ユーザー定義オブジェクトの概念についていまいちイメージ がつかめていません(特にthisとnewを使用している意図など) ご教授いただきたく、よろしくお願いします。

  • C++でのクラスオブジェクトの破棄

    こんにちは。 C++では、プログラムの終了時に、全てのクラスオブジェクトは、デストラクタが呼び出されて破棄されますが、プログラムの途中で、クラスオブジェクトを明示的に破棄する方法はあるのでしょうか? 例えば、new演算子によってメモリを動的に割り当てたポインタなら、delete演算子で破棄できますが、 クラスオブジェクトにdelete演算子は使えないようです。 何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。

  • C++のnewの使い道

    最近C++を勉強しているのですが、new演算子はどういうときに使うべきでしょうか? メモリを動的確保できるのはわかります。 Cのmallocのようなものと考えていいのでしょうか? つまり、関数内でメモリを確保してそのアドレスを返すとか、コンパイル時に不明なサイズのメモリを実行時に確保するとか、任意のタイミングでメモリを開放したい場合などに使うものでしょうか。 ある参考書を読んでいると「引数つきコンストラクタを呼び出す場合はnewでインスタンス生成する」と書いてありました。 デフォルトコントラスタならnewなし、引数付きならnewあり、ということらしいです。 なぜこんなことをする必要があるのでしょうか?

専門家に質問してみよう