- ベストアンサー
javascriptオブジェクトについての疑問
- javascriptを勉強中の方がオブジェクトについて疑問を抱いています。
- オブジェクトリテラルとObjectコンストラクタのインスタンスを比較し、new演算子の必要性について調査しています。
- 質問者はオブジェクトについて理解が足りず、アドバイスを求めています。
- みんなの回答 (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
その他の回答 (1)
- yyr446
- ベストアンサー率65% (870/1330)
var obj = new Object(); と var obj=function(){}; これが等価で、 var obj={}; だと、まだObjectはインスタンスされていないのでは、...
お礼
ご回答ありがとうございます。 再度見直してみます。
お礼
ご丁寧にありがとうございます。 何度も読み返してみたのですが、、、難しいですね。 new Object() と {} は等価と考えて良いようです。 とりあえずここの部分でちょっとすっきりしました! もっと勉強してまた読み返させていただきます。