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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Linux バイナリ実行できない "...
-
Vb.netのグローバル変数の宣言...
-
confirmの連続?
-
Excel VBA の ChangeFileAccess
-
Boolean型配列中のTrueの有無を...
-
ASP+アクセスでのSQLコメントに...
-
Array.prototype.~の使い方に...
-
ifreamをリロードしたい
-
HTTPSのとき":"が"%3A"ではなく...
-
VB.NETで変数の型は自作...
-
【Jquery】changeイベント毎にa...
-
MFCのキャプション変更
-
idを使わずにonclickで自身の要...
-
同じIDで定義した要素の配列を...
-
javascriptを用いて作成された...
-
window.openでタイトル名の指定
-
C#OpenCv V4にのエラーに関する...
-
ジェネレーターの作り方
-
ASP.NETのコントロールの値をJa...
-
jQueryの :not() .not() が有効...
マンスリーランキングこのカテゴリの人気マンスリー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における事前バインディング...
おすすめ情報