javascriptを只今勉強中なのですが、オブジェクトについてこんがらがってしまいました。
var obj = new Object();
var obj2 = {};
Object.prototype.prop1 = "hoge";
obj,obj2共にprop1にhogeがセットされるのですが、オブジェクトリテラルのobj2は
Objectコンストラクタのインスタンスと解釈できるのでしょうか??
new演算子について色々とfirebugで調べていたところこの疑問が出てきました。
newなしでもインスタンスができるのでしょうか?
オブジェクトを理解していないので意味不明な質問かもしれませんが
どなたかアドバイスいただけると嬉しいです。
No.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 …
ご丁寧にありがとうございます。
何度も読み返してみたのですが、、、難しいですね。
new Object() と {} は等価と考えて良いようです。
とりあえずここの部分でちょっとすっきりしました!
もっと勉強してまた読み返させていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- 中学校 Do you want a new bag? Want you a new bag? この二つの違い 3 2022/07/30 15:55
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
- JavaScript javascript で外部サイトにデータ入力させて自動でボタンを押すことは可能ですか? 1 2023/01/30 16:23
- JavaScript javaScriptで画面に値を入れるには 1 2022/08/14 12:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ワイルドカード<?>と型パラメー...
-
VBA 同じ名前のオブジェクトを...
-
BufferedWriterのcloseメソッド
-
パワーポイントのVBAでテキスト...
-
オブジェクトと関数の違い
-
COMコンポーネントって何?
-
C#でフォームのオブジェクト名...
-
Excelファイルをgrep検索したい
-
vb.net オブジェクト指向につい...
-
【Java】入力した西暦→和暦に変...
-
Excel VBA : イコールになら...
-
Error.prototype結果のd {name
-
オブジェクトを枠線に合わせる...
-
署名と検証
-
オブジェクト名をforループ内で...
-
多人数のじゃんけんプログラム
-
VBA 下記ソースについて質問で...
-
CFileDialogでフォルダだけを選...
-
EXCEL VBAにて動的にCheckBOXを...
-
これは名前空間ですか?それと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
vb.net オブジェクト指向につい...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
時間帯判定をする。
-
LISTBOXの内容が更新されま...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ADO オブジェクトの渡し方
-
bmp画像をjpegやpng画像に圧縮...
-
Vbで通常使用するプリンターを...
-
戻り値がクラスオブジェクト
-
VBAでvlookup関数から、別シー...
おすすめ情報