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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
static constメンバ変数(配列)...
-
Excel VBA の ChangeFileAccess
-
javascriptで文字挿入でtoggle...
-
C# .NET DataGridView の行を追...
-
Linux バイナリ実行できない "...
-
Array.prototype.~の使い方に...
-
hogehogeの由来
-
JavaScript を使ってpkゲームを...
-
同じIDで定義した要素の配列を...
-
C#OpenCv V4にのエラーに関する...
-
<a>タグのテキストを取得
-
functionから別のfunctionを実...
-
ActiveXobjectが作成できない
-
ジェネレーターの作り方
-
ASP.NET MVCでObjectをjsに渡す
-
window.openでタイトル名の指定
-
undefinedを表示させない方法は...
-
jspからjavascriptの変数引継ぎ
-
翌月を取得するGASが分かりません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
Vb.netのグローバル変数の宣言...
-
【正規表現】【javascript】CR...
-
ボタンをクリックすると数が増...
-
「オブジェクトが必要です。」...
-
Linux バイナリ実行できない "...
-
ASP+アクセスでのSQLコメントに...
-
Excel VBA の ChangeFileAccess
-
【Jquery】changeイベント毎にa...
-
HTTPSのとき":"が"%3A"ではなく...
-
MFCのキャプション変更
-
C言語でクロージャを記述する
-
javascriptで文字挿入でtoggle...
-
同じ型【ハイフンと数字】だけ...
-
VB.NETで変数の型は自作...
-
サブウインドウから親ウインド...
-
親の親の・・・を抽出するSQL文
-
関数を呼び出すHTMLタグ<body o...
-
onclick指定関数の引数へローカ...
-
VB6における事前バインディング...
おすすめ情報