javascriptオブジェクトについての疑問

このQ&Aのポイント
  • javascriptを勉強中の方がオブジェクトについて疑問を抱いています。
  • オブジェクトリテラルとObjectコンストラクタのインスタンスを比較し、new演算子の必要性について調査しています。
  • 質問者はオブジェクトについて理解が足りず、アドバイスを求めています。
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
  • my--
  • ベストアンサー率89% (91/102)
回答No.2

かえって混乱してしまうかも知れませんが、関連項目をまとめてみました。 「オブジェクト初期化子」 http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/11_Expressions.html#section-11.1.5 ------------------------------------------------------- 生成規則 ObjectLiteral : { } は、次のように評価される: 1. 式 new Object() と同様に新規にオブジェクトを生成する。 2. Result(1) を返す。 ------------------------------------------------------- new Object() と {} は等価と考えて良いようです。 「new 演算子」 http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/11_Expressions.html#section-11.2.2 ------------------------------------------------------------------------------------- 生成規則 NewExpression : new NewExpression は、次のように評価される: 1. NewExpression を評価する。 2. GetValue(Result(1)) を呼出す。 3. Type(Result(2)) が Object でなければ、例外 TypeError を投げる。 4. Result(2) が内部 [[Construct]] メソッドを実装しなければ、例外 TypeError を投げる。 5. 引数なしで Result(2) の [[Construct]] メソッドを呼出す。(引数値に空リストを提供する。) 6. Result(5) を返す。 ------------------------------------------------------------------------------------- ※ここでは引数を取らない例です。 new 演算子は(コンストラクタの)内部 [[Construct]] メソッドを呼出します。 オブジェクト生成時に内部 [[Construct]] メソッドが設定されるのはFunctionオブジェクトだけ。 言い換えれば、new 演算子と共に呼出せる(コンストラクタとして機能する)のは Functionオブジェクトだけです。 「[[Construct]]」 http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/13_Function_Definition.html#section-13.2.2 -------------------------------------------------------------------------------------------- Function オブジェクト F の [[Construct]] プロパティが呼出されるとき、次のステップが取られる: 1. 新しい Native ECMAScript オブジェクトを生成する。 2. Result(1) の [[Class]] プロパティを "Object" に設定する。 3. F の prototype プロパティの値を取得する。 4. Result(3) がオブジェクトならば、Result(1) の [[Prototype]] プロパティを Result(3) に設定する。 5. Result(3) がオブジェクトでなければ、Result(1) の [[Prototype]] プロパティを、セクション 15.2.3.1 で述べるオリジナルの Object prototype オブジェクトに設定する。 6. F の [[Call]] プロパティを呼び出す。Result(1) を this 値として提供し、引数値として [[Construct]] に渡された引数リストを提供する。 7. Type(Result(6)) が Object ならば、Result(6) を返す。 8. Result(1) を返す。 -------------------------------------------------------------------------------------------- コンストラクタ(内部 [[Construct]] メソッド)の振る舞いを簡単にまとめると 新しいオブジェクトを生成する。 F(コンストラクタ)の prototype プロパティの値を取得する。 生成したオブジェクトの内部 [[Prototype]] プロパティを F の prototype プロパティの値に設定する。 F の [[Call]] プロパティを呼び出す。生成したオブジェクトを this 値として提供し 引数値として [[Construct]] に渡された引数リストを提供する。 生成したオブジェクトを返す。 var Constructor = function () { this.property = 'hoge'; }; Constructor.prototype.method = function () { alert(this.property); }; var Instance = new Constructor; Instance.method(); //hoge >>newなしでもインスタンスができるのでしょうか? 「関数として呼出される Array コンストラクタ」 http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/15-4_Array_Objects.html#section-15.4.1 -------------------------------------------------------------- Array がコンストラクタとしてではなく関数として呼出されるならば 新規に Array オブジェクトを生成して初期化する。関数呼出し Array(...) は 同じ引数を持つオブジェクト生成式 new Array(...) と等価である。 -------------------------------------------------------------- 質問の意図とは外れるかも知れませんが、Arrayの例です。 いくつかの組込みオブジェクトは new 演算子を省略できるようです。 脱線気味にプロトタイプチェーンについて少し Object.prototype.prop1 = "hoge"; var num = new Number; alert(num.prop1); //hoge Numberオブジェクトnumの内部 [[Prototype]] プロパティの値はNumber.prototype Number.prototypeの内部 [[Prototype]] プロパティの値はObject.prototype(prop1が見付かる) Object.prototypeの内部 [[Prototype]] プロパティの値はnull(プロトタイプチェーンの末端) ※Numberオブジェクトに限らずObject.prototypeのプロパティはすべてのオブジェクトに継承されます。 が、手を出すべきではない「聖域」とされているようです。当然それなりの理由がありますが(略) 「Object.prototype.hasOwnProperty (V)」 http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/15-2_Object_Objects.html#section-15.2.4.5 ------------------------------------------------------------------------- hasOwnProperty メソッドが引数 V で呼出されるとき、次のステップが取られる: 1. O を this オブジェクトとする。 2. ToString(V) を呼出す。 3. O が Result(2) で与えられる名前のプロパティを持たなければ、 false を返す。 4. true を返す。 ------------------------------------------------------------------------- 直接のプロパティと継承(プロトタイプチェーン)プロパティを識別するメソッドが用意されています。 alert(num.hasOwnProperty('prop1')); //false 「ECMA-262 3rd edition: 総目次」 http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/fulltoc.html 「オブジェクト (Objects)」 http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/4_Overview.html#section-4.2.1

poyon8989
質問者

お礼

ご丁寧にありがとうございます。 何度も読み返してみたのですが、、、難しいですね。 new Object() と {} は等価と考えて良いようです。 とりあえずここの部分でちょっとすっきりしました! もっと勉強してまた読み返させていただきます。

その他の回答 (1)

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

var obj = new Object(); と var obj=function(){}; これが等価で、 var obj={}; だと、まだObjectはインスタンスされていないのでは、...

poyon8989
質問者

お礼

ご回答ありがとうございます。 再度見直してみます。

関連するQ&A

  • javascript new演算子について質問があります。

    javascript new演算子について質問があります。 只今javascript勉強中なのですが、どこかのサイトでnew演算子は悪いパーツとの 記事を読みました。 そこでnew演算子を使用せずにオブジェクト生成の方法を試行錯誤考えてみたのですが (IE用に__proto__もなしで)例えば以下コードはアリなコードでしょうか?? あるいはありえない感じでしょうか?? またnewが悪なのはインスタンスを作る時にnewを付け忘れると、 グローバルな汚染をしてしまうということだけなのでしょうか?? オブジェクトとプロトタイプの理解に苦しんでいるところなので 色々と曖昧なのですが、どなたかどうぞご教授お願い致します。 var obj = {}; obj.method = function(){ this.prop1 = "hoge" return this; }; obj.method.prototype = obj.method(); obj.method.prototype.prop2 = "fuga"; var obj2 = obj.method(); console.log(obj2)

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

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

  • javascriptのconstructorプロパティについて

    constructorプロパティとは、 オブジェクトの初期化で使用されたコンストラクタ関数を参照 とのことなので、下記2パターンのPGを作成しました 1.prototypeの明記なし function Hoge(){ this.init = "Hogeで初期化"; this.getInit = function(){ return this.init; } } var obj = new Hoge(); alert(obj.constructor == Hoge); for(prop in obj){ alert( prop + " - " + obj[prop]); } //実行結果 True init - Hogeで初期化 getInit - function () { return this.init; } 2.prototypeの明記あり function Hoge(){ this.initialize.apply(this,arguments); this.init = "Hogeで初期化"; this.getInit = function(){ return this.init; } } Hoge.prototype ={ initialize:function(){ this.init = "Hoge.prototype.initializeで初期化"; }, getInit:function(){ return "Hoge.prototype.getInit()"; } } var obj = new Hoge(); alert(obj.constructor == Hoge); for(prop in obj){ alert( prop + " - " + obj[prop]); } //実行結果 false init - Hogeで初期化 getInit - function () { return this.init; } initialize - function () { this.init = "Hoge.prototype.initialize\u3067\u521D\u671F\u5316"; } ・質問内容 prototypeの明記なしの場合は、Hogeのコンストラ関数を参照している(結果がTrueのため) prototypeの明記ありの場合は、falseのためコンストラ関数を参照していないのですが、 prototype明記あり、なしで結果が異なる理由が分からない状態です。 (prototype.constructorにも手を出したのですが、上記が解決しないため  constructorプロパティに関してのみ質問した次第です) ネット、書籍等で調べたのですが、検討がつかない状態です。 お手数ですが、ご教授お願い致します。

  • コンストラクタとプロトタイプについて

    ネットで検索したりして調べているのですがいまいちわからなかった箇所が あるので質問させていただきます。 コンストラクタで設定するのとプロトタイプで設定する違いがいまいちわかりません。 例えば function Test { this.prop = hoge; } Test.prototype.prop1 = hogehoge; の場合 コンストラクタのほうが優先されてhogeがでるのはわかるのですが 下記の場合はプロタイプのほうが優先されてhogehogeと出てしまうのは どうしてでしょうか? <script language="javascript"> <!-- //コンストラクタ function Test(){alert("hoge"); } //prototypeでセット Test.prototype=alert("hogehoge"); //オブジェクト作成 var TEST = new Test(); window.onload=TEST; --> </script>

  • javascript 親オブジェクトと子オブジェクトを分離させたい

    例えばjavascriptで下のようなコードを書いたとします。 a=new Array() a[0]=new OBJ(); function OBJ(){ this.prop=document.getElementById('aaa') this.prop2=document.getElementById('bbb') } a[0].prop.addEventListener(click,func,false); function func(){ ??? } func()関数内でthisを使うとa[0].propを参照できます。 一方、a[0].prop2を参照するにはどうすればいいのでしょうか? 配列の要素番号を指定しないで参照させる方法が分からず悩んでいます。 下のようにもしできるのであればいいのですが。。。 a[0]とpropのオブジェクトを分割->a[0]オブジェクトを抜き出し-> a[0]オブジェクトにprop2を追加 または別の方法があるのでしょうか。 ぜひぜひご回答のほどお願いいたします。

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

    下記内容はあるサイトのインスタンスについての説明文です。 画像は、自分なりに理解したものです。 (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演算子でメモリ上に記憶場所を確保して作られたオブジェクトをインスタンスオブジェクトといいます。 つまり、 オブジェクト == インスタンスオブジェクト で、 インスタンス != インスタンスオブジェクト インスタンス != オブジェクト です。 ----------------------------------------------------

  • javascriptのコードについて

    以下のコードなのですが、 エンクロージャー関数の ローカル変数hogeをさらに、エンクロージャー内部で定義された 関数ででクロージャーとして保持させたいメソッドのコードですが var Method = function (){ var hoge = "初期値"; var getter = function (){ return hoge; } var setter = function (param){ hoge = param; return hoge; } return {"set" : setter,"get" : getter} } var obj = Method(); console.log(obj); console.log(obj . get()); obj.set("初期値変更"); console.log(obj.get()); obj . set("更に変更"); console.log(obj.get()); この場合、メソッドの返り値として、一般的な文献に乗っている関数(関数オブジェクト)を返すのではなく オブジェクトリテラルとして返しています。 この場合でも、動きとしてはクロージャーの動きをしているのでhogeという変数の保持はできているっぽいんですが クロージャーって関数内で定義された関数であれば、どういう返り値の返し方でも クロージャーになるのですかね? また、この方法は、一般的にjsで関数コンストラクタ呼び出しをしてインスタンスを作る際privateメンバを実現する方法として紹介されていますが、 これはクロージャーとして生成するたんびに内部の変数を保持するためメモリ食い虫になるらしいのですが まず間違いなく、このクラス(便宜上そう呼びます)のインスタンスはひとつしかつくることはない!!という仕様だとしても いけないのでしょうか? というかもう現状javascripのバッドノウハウ的なものになっているのでしょうか?

  • オブジェクトの内容を確認する方法

    JavaScriptでオブジェクトの中身を確かめたいときに、 JSON.stringifyや下の関数のようなやり方がありますが、 var showObj = function(obj) { var props = ""; for (var prop in obj){ props += prop + "=" + obj[prop] + "\n"; } return props } JSON.stringify(Math)//{} showObj(Math)// となり、Mathオブジェクトの中身は確認できませんでした。 これはどういった理由によるものなのでしょうか。 また、(JavaScriptのコードから)確認する方法はあるのでしょうか。

  • JavaScriptでインスタンスを比較してみたい

    JavaScriptでインスタンスを比較してみたいのですが、色々分からないことがあるので教えてください。 ■質問1 ・そもそも、JavaScriptにインスタンスはあるのでしょうか? ■質問2 ・下記で「hoge1」「hoge2」はインスタンスではないのでしょうか?(単にオブジェクトを取得しているだけ?) var myApp = {  point: 0,  setPoint: function(p){   this.point= p;  },  getPoint: function(){   return this.point;  } }; myApp.point = 5; var hoge1 = myApp.getPoint(); var hoge2 = myApp.getPoint(); console.log( hoge1 === hoge2 ); // true ■質問3 ・「Object.create」か「new」すれば、インスタンス生成できる? ■質問4 ・インスタンスの比較はどうやるのでしょうか? ・「===」?

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

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

    • ベストアンサー
    • PHP

専門家に質問してみよう