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)
No.2ベストアンサー
- 回答日時:
var obj = {};
obj.method = function(){
//new演算子と共に呼ばないとthisの値はobjになります
//alert(this === obj); // true
this.prop1 = "hoge"; // obj.prop1 = "hoge";
return this; // return obj;
};
obj.method.prototype = obj.method(); // obj.method.prototype = obj;
//alert(obj.method.prototype === obj); // true
obj.method.prototype.prop2 = "fuga"; // obj.prop2 = "fuga";
var obj2 = obj.method();
//alert(obj2 === obj); // true
//alert(obj.hasOwnProperty('prop1')); // true
//alert(obj.hasOwnProperty('prop2')); // true
objに直接プロパティprop1、prop2が追加されているだけですが
これで理解できるでしょうか?
new演算子、プロトタイプうんぬんは先ず基本的なところを抑えてから
ではないかと個人的には思いますけど。
質問に関連する(と思われる)記事をいくつか読んでみました。
JavaScript: The Good Parts(存在すらしりませんでしたが良書と評判です)
http://www.amazon.co.jp/gp/product/4873113911
『JavaScript:The Good Parts』を読んで
http://www.kanasansoft.com/weblab/2009/04/javasc …
『JavaScript:The Good Parts』にツッコミ
http://www.kanasansoft.com/weblab/2009/04/javasc …
JavaScriptのnewって本当にいらない子?
http://d.hatena.ne.jp/jdg/20090706
JavaScript に new 演算子は要らない
http://diaspar.jp/node/224
確かにnew演算子を付け忘れても普通に関数が実行されるだけですから
バグを見付けにくくやっかいかもしれないですね。
質問とは関係ないですが、関数とコンストラクタが明確に仕様で区別されていれば
普通にエラーを投げることができると思いますけど、ひと目でそれと分かる「コンストラクタ宣言」みたいなのがあってもいいような気はします。
私レベルが言えることは、それと分かる名前を付け、いちいちnew演算子を書かなくていいように
工夫することぐらいでしょうか。
なるほど、なんとな~く理解できてきたかなぁと思っていましたが、
基礎から勉強しなおしたいと思います。
サイトも参考にしてみます。
ご丁寧な回答ありがとうございました。
No.1
- 回答日時:
昔のjavascriptはオブジェクト一つ作るにもnewをつかったもんですけどね・・・
理解しないままprototypeをいじる方が危険なような・・・
<script>
var obj = new createObj();
alert(obj.prop1)
obj.method();
alert(obj.prop1)
function createObj(){
this.method=method;
}
function method(){
this.prop1="hoge";
}
</script>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ASP+アクセスでのSQLコメントに...
-
Linux バイナリ実行できない "...
-
【正規表現】【javascript】CR...
-
C# .NET DataGridView の行を追...
-
Boolean型配列中のTrueの有無を...
-
Inherits EventArgsの初期化
-
HTTPSのとき":"が"%3A"ではなく...
-
フラグについて
-
Excel VBA の ChangeFileAccess
-
引数付きコンストラクタでコン...
-
static constメンバ変数(配列)...
-
MFCのキャプション変更
-
ボタンをクリックすると数が増...
-
「クエリが閉じてるなら」「ク...
-
awk内でsystem関数を使用しfunc...
-
jQuery 変数を複数のセレクタ...
-
JavaScriptで「〇以上▲まで」の...
-
<a>タグのテキストを取得
-
同じIDで定義した要素の配列を...
-
ASP.NETのコントロールの値をJa...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
ASP+アクセスでのSQLコメントに...
-
Linux バイナリ実行できない "...
-
【正規表現】【javascript】CR...
-
Vb.netのグローバル変数の宣言...
-
Excel VBA の ChangeFileAccess
-
javascriptで文字挿入でtoggle...
-
HTTPSのとき":"が"%3A"ではなく...
-
「オブジェクトが必要です。」...
-
複数ファイルで使うグローバル...
-
C# .NET DataGridView の行を追...
-
【Jquery】changeイベント毎にa...
-
ボタンをクリックすると数が増...
-
URLの一部をコピーできるブック...
-
static と externについて
-
バイナリファイルから文字列を...
-
ifreamをリロードしたい
-
class指定したHTML要素の背景色...
-
VC++のちらつき防止方法
-
サブウインドウから親ウインド...
おすすめ情報