プロが教えるわが家の防犯対策術!

下記内容はあるサイトのインスタンスについての説明文です。
画像は、自分なりに理解したものです。

(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演算子でメモリ上に記憶場所を確保して作られたオブジェクトをインスタンスオブジェクトといいます。
つまり、
オブジェクト == インスタンスオブジェクト
で、
インスタンス != インスタンスオブジェクト
インスタンス != オブジェクト
です。
----------------------------------------------------

「インスタンスオブジェクトとは何かについて」の質問画像

A 回答 (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 規格にありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/05/04 13:19

ここらへんを見ています?



http://chaichan.web.infoseek.co.jp/src/javascnew …

>考え方に間違いがあるでしょうか?

まああっているかと。

> オブジェクト == インスタンスオブジェクト
> インスタンス != インスタンスオブジェクト
> インスタンス != オブジェクト

ちょいと意味不明かと。何を説明したいのでしょうか。

上記URLのだと、Number型とかの話が続きますが、ちょっと説明がおかしいというか不十分だと思います。

インスタンスだとかオブジェクトだとかの用語は、C++やJava、Smalltalkなど、別言語の用語と混用されたりするので、あんまり厳密にとらえないほうがよいかと。
逆に、さも厳密っぽいものとして使っちゃうと、世のプログラミング言語論者から、非常(非情)なる指摘を受けることになりかねないです。

厳密に覚えるなら、ECMaScriptの仕様書とかを読んだほうが良いと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/05/04 13:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!