- JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
34 :デフォルトの名無しさん[sage]:2015/12/21(月) 01:11:35.42 ID:RcNL5yk7 - >>33
ふむ。もう一度確認してみたがエラーにはなるようだ。 確認してから書いたのだが、どうやら間違っていたらしい。すまん。 > それと、自由に「.prototype」を拡張することではなく自由に「プロトタイプ」を定義できることこそが、 > インスタンスベースと見た時のJSの思想だと思う。 多分これは違う。 > 自由に「.prototype」を拡張する これでは既存のクラスシステムと同じだ。 「自分で型を作れる」または「『新規の』型を自分で作れる」だけに過ぎない。 JavaScriptのプロトタイプベースは、「既存の」型を拡張できるところが違う。 ただこれを活用できるかはまた別だ。 これはMDNでも紹介されている。 > これはとても強力です。 > JavaScript では、プログラム上でいつでもどれかのプロトタイプを変更することができます。 > ということは、実行時に既存のオブジェクトに対して追加のメソッドを加えることができるのです: > (中略) > これは Person オブジェクトをデバッグするときに役立ちます: > https://developer.mozilla.org/ja/docs/Web/JavaScript/A_re-introduction_to_JavaScript ただしデバッグ時以外に活用する方法を誰も思いついていないのだと思う。
|
- JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
35 :デフォルトの名無しさん[sage]:2015/12/21(月) 01:12:01.84 ID:RcNL5yk7 - ある実行中のJavaScriptがあって、それに対してevalでprototypeの変更を行えば、
仮に鯖上で実行中であってもいきなり動作を変えられる。これは他の言語では出来ない。 XenやVMWareがやっているようなライブマイグレーションを言語がサポートしている。 ただそんな機能があっても現実的には必要ない。 サーバーを一旦落としてデバッグ済みのソースに切り換えるのが今の通常の方法だ。 どうしても落とせないところは、今は上記のようにハードウェアレベルでライブマイグレーションができる。 だからソフトウェアレベルでのライブマイグレーションは必要ない。 一応文法的にもprototypeを拡張する方向で出来ている。 クラスに対して色々な書き方があるが、好みはあるとしても、 文法的/構造的に一番無理なく書けるのは prototype への直接差し込みだ。 だからMDNでもその記法で書かれている。 元々 prototype を拡張しながら使うように設計されているので、当然ではあるのだが。 > var Person = function (firstName) { > this.firstName = firstName; > }; > > Person.prototype.sayHello = function() { > console.log("Hello, I'm " + this.firstName); > }; > https://developer.mozilla.org/ja/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript
|
- JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
36 :デフォルトの名無しさん[sage]:2015/12/21(月) 01:12:28.39 ID:RcNL5yk7 - > プロトタイプ汚染というのはビルトインを拡張するときくらいしか問題にならない。
> それすらもES6モジュールで分離すれば解決するだろう。 しかし@@toStringTagの件はそれだろ? 俺は「そんなの書き換える奴が悪い」で終わりだが、 それが許されないから ==='[Object Array'] では駄目で Array.isArray なんだろ? ただ import で自由にビルトインも含めて拡張できるのであれば、 上記「禁忌」とされてきて開かずの扉になっている部分を、誰かこじ開けるかもしれない。
|