
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で質問しましょう!
似たような質問が見つかりました
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- Ruby No route matches [GET] "/posts/5/destroy" 1 2022/03/24 13:00
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- JavaScript javascriptで移動ボタンを押した際に遷移するボタンを追記したい 1 2022/11/29 03:02
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ボタンをクリックすると数が増...
-
展開式がコメントになってしま...
-
Boolean型配列中のTrueの有無を...
-
アンカーリンクをクリックさせ...
-
ifreamをリロードしたい
-
Linux バイナリ実行できない "...
-
VB6における事前バインディング...
-
Cで作成したDLLをVBで呼出
-
Vb.netのグローバル変数の宣言...
-
window.onloadでのfunction
-
引数付きコンストラクタでコン...
-
System::Drawing::Color::XXXX...
-
MFCのキャプション変更
-
VC++のちらつき防止方法
-
JavaScriptで連続する空白を、h...
-
【正規表現】【javascript】CR...
-
&= ~0x0c; &= ~0x03; |=1;
-
バイナリファイルから文字列を...
-
サブウインドウから親ウインド...
-
javascript new演算子について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HTTPSのとき":"が"%3A"ではなく...
-
ボタンをクリックすると数が増...
-
【正規表現】【javascript】CR...
-
Boolean型配列中のTrueの有無を...
-
Linux バイナリ実行できない "...
-
ASP+アクセスでのSQLコメントに...
-
Excel VBA の ChangeFileAccess
-
Vb.netのグローバル変数の宣言...
-
static constメンバ変数(配列)...
-
同じ型【ハイフンと数字】だけ...
-
javascriptで文字挿入でtoggle...
-
アンカーリンクをクリックさせ...
-
VC++のちらつき防止方法
-
C# .NET DataGridView の行を追...
-
MFCのキャプション変更
-
hoge の謎
-
confirmの連続?
-
return (A && B) || 0;
-
ifreamをリロードしたい
-
-(ハイフン)_(アンダーバー)の...
おすすめ情報