街中で見かけて「グッときた人」の思い出

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)

A 回答 (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演算子を書かなくていいように
工夫することぐらいでしょうか。
    • good
    • 0
この回答へのお礼

なるほど、なんとな~く理解できてきたかなぁと思っていましたが、
基礎から勉強しなおしたいと思います。
サイトも参考にしてみます。
ご丁寧な回答ありがとうございました。

お礼日時:2010/04/06 23:12

昔の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>
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
再度勉強してみます。

お礼日時:2010/04/06 23:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報