演算子とともに使われた引数をそのまま用いる。返り値がオブジェクトならそれを返す。作ったオブジェクトを返す。なんかPerlのblessっぽい。ブログの記事とかで見かけるけど、__proto__って何?サイ本にも書いてなさげ。調べてみると、__proto__はプロトタイプチェーンを辿る時に使うプロパティとのこと。__proto__の処理の部分は端折って、1、3、4に注目すると、新しくオブジェクトを作って、関数を呼び出して、関数のthisの値に新しく作ったオブジェクトを格納して、呼び出す関数の返り値がオブジェクトなら、そのオブジェクトを返して、そうでなければ、新しく作ったオブジェクトを返すとのこと。ex8額面どおり動かしてみる。thisに値は代入できないですよね。ex9仕方ないのでthisの部分も無視する。いうか仕様にあるとおり、関数の返り値がオブジェクトなら、新しいオブジェクトを作ろうが何しようが、最終的な返り値は、関数で返すオブジェクトになるんだし、thisを無視しても問題なさそう。jdgうまくいったー。グローバル空間が使われてないかもチェック。defined大丈夫そうに見える。これで解決??せ、先生!問題が発生しました!解決したと思った矢先に問題発生。undefinedprototypeプロパティに代入した値がとれない。ex11__proto__の存在を無視せず、ECMAScriptの仕様どおり、新しいオブジェクトの__proto__に呼び出し元関数のprototypeをコピーして確認してみる。プロトタイプチェーンを辿るときには、prototypeではなく、__proto__が使われるみたい。これ、IEでは動きません。__proto__がIEにはないからです。これに関しては、別にIEに落ち度はないように思います。__proto__は、ECMAScriptの標準ではないから。え?Firefoxちゃん、__proto__でいくの?ECMAちゃんそんなこと言ってた?えぇ!?みんなそうなの??嘘?私だけ仲間はずれ!?もういいよ!みんな嫌い!絶交よ!私をあなたたちと一緒にしないで!!IEたん。なんかかわいそうにも見える。Prototype内部プロパティ(Firefox等の__proto__)を、IEで直接書き換える手段は提供されていないようなので、prototypeプロパティを使うなら、newは避けて通れないってことになりました。IEではnew以外でPrototype内部プロパティを書き換えることができません。なると、newを使わないという選択肢は取れなくなるのでしょうか?ex12そこで、弾さんの紹介していたプロトタイプ的継承の出番ですよ。ここまで考察して、ようやく有効性が理解できた。プロトタイプ的継承*1まずは、汎用性を考えずに実装してみる。Blogと値が返せればいいのですが、それはできないみたいです。新しい関数オブジェクトを用意して、Blogのすべてをコピー。Blogと同様の処理を実現しています。最終的にnewしたいオブジェクトすべてにこれを実装するのは面倒なので、例にあるとおりのprototype的継承の形にするのがやっぱ便利。taijuこれでnewから解放された!まとめnewがいらないってのは、額面通り受け取るんじゃなくて、newを使わなくて済むように設計しときましょうって意味のようです。*2追記id:Layzieさんより、ブコメで以下のコメントをいただきました。思考の流れがすごく勉強になる。ありがとうございます!でも、実はこれ、思考の流れをそのまま表しているわけではなくて、記事で書いてない部分で、大量の試行錯誤をしています。見た目は違うけど、実際には同じことをしていたりとか、試行する必要性が皆無なことを、言語仕様を理解しきれていないため、何度もやってたりとか。この記事に掲載している思考の流れは、第三者が見て混乱しないものだけを載せているということだけ注記させていただきます。検索プロフィールid:jdgたくさん情報を食べて、たくさん発信すると、あとになって味わい深い。Blog|ブログを報告する。