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

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

var obj = new Object();
var obj2 = {};
Object.prototype.prop1 = "hoge";

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

A 回答 (2件)

かえって混乱してしまうかも知れませんが、関連項目をまとめてみました。



「オブジェクト初期化子」
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …
-------------------------------------------------------
生成規則 ObjectLiteral : { } は、次のように評価される:

1. 式 new Object() と同様に新規にオブジェクトを生成する。
2. Result(1) を返す。
-------------------------------------------------------
new Object() と {} は等価と考えて良いようです。

「new 演算子」
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …
-------------------------------------------------------------------------------------
生成規則 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/ecma26 …
--------------------------------------------------------------------------------------------
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/ecma26 …
--------------------------------------------------------------
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/ecma26 …
-------------------------------------------------------------------------
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/ecma26 …
「オブジェクト (Objects)」
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます。
何度も読み返してみたのですが、、、難しいですね。

new Object() と {} は等価と考えて良いようです。

とりあえずここの部分でちょっとすっきりしました!
もっと勉強してまた読み返させていただきます。

お礼日時:2010/04/04 08:12

var obj = new Object();



var obj=function(){};
これが等価で、
var obj={};
だと、まだObjectはインスタンスされていないのでは、...
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/04/03 10:00

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