

下記ページに以下の記載がありますが、.prototype = {}は、一般的にはどういう扱いをされているのでしょうか？  
・仕様上は許可されているが使用すべきではない  
・絶対に使用すべきではない  
・規約による  
・別に使用しても構わない

> ClassName.prototype = {} って、やっていいの?

<http://qiita.com/LightSpeedC/items/d307d809ecf2710bd957>

* * *

下記ページの記載は、単にinstanceofの挙動を確認するためだけのもの？

> C.prototype = {};

<https://developer.mozilla.org/ja/docs/JavaScript/Reference/Operators/instanceof>

* * *

**疑問**  
・最初に掲げたページで言っていることは分かるのですが、それならそもそもなぜこの書き方が許容されているのでしょうか？  
・規約でObject.create()のみを使用するよう制限すべき？  
・Object.create()がないES3の頃はどうしていたのでしょうか？  
・.prototype = {}を使用可とすると、instanceofについて意図しない結果を返す可能性もあると思うのですが…  
・.prototype = {}と、instanceofは併用不可という考え方で合っているでしょうか？


CC BY-SA 3.0
2015-05-04T01:21:56.823
9803
2015-06-03T13:06:18.660
7886
question
javascript
ConstructorName.prototype = {} って、やっていいの?


結論から言うと、.prototype.constructorとinstanceofのことが分かっているのならやってよいです。  
そもそも自分で作ったクラスにinstanceofを適用するような書き方をするのは稀ですし、  
もしどうしてもinstanceofが平常通り機能するようにする必要があれば、

[code]

    C.prototype = {
      constructor: C,  // ←これを入れる
      ......
      ......
    }
    
[/code]

とすればいいだけのことです。

その記事は主にES3からES5に切り替わる段階の覚書を並べたもので、結局はES5から入るObject.createを効果的に使っていこうねという趣旨でしょう。

しかし今はES5からES6に切り替わる段階なので「最善」も変わっています。  
この辺りのことについて話を広げればいろいろ言いたいことがたくさんありますが、  
簡潔に言うと、「意味をわかった上でどうぞ効果的に使ってください」です。

「__proto__」についてもその記事が書かれた当初と違って、もう標準になることが決まっているので、サポートする環境が限られることを理解して大いに使って結構です。


CC BY-SA 3.0
2015-05-04T10:30:50.730
9817
2015-05-04T10:30:50.730
5721
9803
answer