+ JavaScript(ECMAScript)質問用スレッド vol.123 + [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2016/12/21(水) 21:56:53.30ID:xYX0mlO/
プログラマ板の趣旨にあわせてブラウザ限定ではなくサーバーサイドJavaScriptや
トランスパイラなどの関連技術の話題も取り扱うように変わりました。
ECMAScriptの言語仕様の話題。最新ECMAScriptによるモダンな書き方、Promiseやasync/awaitを
使った非同期プログラミング。ES2015、2016、2017等の最新ECMAScriptをブラウザで今すぐ使う方法、
ビルド環境やbowerやnodeのパッケージを使う方法等、モダンなJavaScript環境についての幅広い話をしましょう。

ECMAScript対応実行環境一覧(ブラウザやbabelを含む)
http://kangax.github.io/compat-table/es5/
http://kangax.github.io/compat-table/es6/ (= es2015)
http://kangax.github.io/compat-table/es2016plus/
http://kangax.github.io/compat-table/esnext/

JavaScriptとは?
もともとMozillaの前身のNetscapeが作った言語であり本来のJavaScriptはFirefoxの実装のみです。
JavaScriptの正式な仕様名はECMAScriptです。ですが一般に使われているとおり
ChromeやEdgeで使う言語もJavaScriptとしてこのスレでは扱います。
Firefox等のJavaScript実装は最新のECMAScriptに準拠しています。

※DOMはブラウザが提供しているものでありJavaScript(ECMAScript)の範囲外です。
なのでDOMを使ったプログラミングは原則としてこのスレの対象外です。
DOMはwindowオブジェクト(ブラウザのホストオブジェクト)経由で
参照するもので、window自体、window.document、window.Workerなどです。
これに関する話題はWeb制作板の下記のスレに移動してください。

+ JavaScript & jQuery 質問用スレッド vol.7 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/hp/1467906819/
jQuery 質問スレッド vol.7
http://echo.2ch.net/test/read.cgi/hp/1478055094/
+ JavaScript の質問用スレッド vol.131 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/hp/1478053599
前スレ + JavaScript(ECMAScript)質問用スレッド vol.122 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1472401404
2021/02/18(木) 10:51:12.81ID:1zMeI46+
>>130
気持ちは分かるがくだらん小競り合いは止めとけ。


>>127
脱線するが、何がずれてるかを教えておく。
つまりはお前のプログラミング理論の全体像がデタラメなのでみんな適当にエスパーしてるから迷走してるのだが。

> なんとなくオブジェクトの簡易版という感じがするが (127)
クロージャがオブジェクトの簡易版なのは『周知の』事実だ。
ただしクロージャ(Lisp)の方がオブジェクト(Simula)よりも古い。そしてこれらを体系的に纏めたのがOOP(クラス)になる。
そして今時の若者はOOPから入るのだから、

> 静的変数と関数を両方オブジェクトのメンバーにすれば (121)
これを読んだら、「ああ、クラスね」と取られるんだよ。より正確に言えば、頭の「静的」を除去して、
「変数と関数を両方オブジェクトのメンバーにする」=クラスであり、
「クラスのクロージャでprivateガー」はJSにおいては、またこれ?、だから話がそっちに流れる。
そして君の用途ならクラスでは「静的クラス変数」とするものだから130の言い分になる。

見たところお前はOOP/クラスの使い方を理解出来てない。そして
> 関数内の静的変数つくる
と言っているところをみると、もしかしてCしかやってないタイプか?
Cには確かに関数内static変数がある。(130はおそらくこれを知らない。が、知らなくていいし、知るべきでもない)
ただし一般的に「使うな」とされてきたものだからまともな奴なら使わない。
ところが最近の若者がCを習う際には実用ではなく文法から入るようで、
「こんな機能もあるんだ!」「static知ってる俺スゲー」らしく、「そんなん使うなアホ」と言ったら「老害ガー」と逆ギレされる。
そしてお前もこいつら「若害」と同類なのだと思う。

なお、「使うな」とされてるのは、一部仕様が奇妙で信頼出来ないのと、そもそも使う必要がないからだ。
Cにおいては関数は全てstaticであり、つまり関数のインスタンスは常に一つだから、関数内staticなんてグローバルと大差ない。
2021/02/18(木) 10:51:41.67ID:1zMeI46+
そしてこの辺の雑多な概念を整理して出来上がったのがOOP/クラスだ。
だからクラスを使えば、全て綺麗に書けるようになってる。
逆に言えば、クラスしか使えない言語はエレガントな書き方しか出来ないようになってるが、
クラス文法を使わずにクラスを書けるJSとかだと、グダグダな書き方も出来るというわけだ。

その実例が>>128だ。
this.count はインスタンスに依らず固定値だから、各インスタンスにエントリがあるだけ無駄だ。(メモリを余分に食う)
だからそういったメンバ関数(=メソッド)はプロトタイプに格納して

myCounter.prototype.count = function () {this.value++;};

とし、クラスにするのが正しい。そしてこの場合、valueがインスタンスメンバとなり、private/publicという話が出てくる。

> そっちのほうが素直な表現だし (127)
今お前がやりたいことを記述する場合、もっとも素直な実装は、クラスを使うことなんだよ。
クラスを使うまでもない、というのなら125のようにアロー関数のワンライナーでもいいし、今回ならbindでも代用可能だが、
ちゃんと設計する気ならクラスにしておけ。
周りの連中が最初からクラスの話をしているのもそのため。その用途ならクラスだから。
さらに言うと、Cで言う「関数内静的変数」はクラス文法だと「静的クラス変数」として確保することになってるから、こっちも最初からそういう話になってる。
当たり前だが、クラスは後発の洗練された文法なのだから、先行したグダグダ文法で実装出来たことを記述する能力は持ってる。

ただまあ、127は俺の嫌いなタイプではない。
お前はちゃんと自分で考えてる。ただし浅すぎるが。
でも、文法しか学ぶ気のない最近の若害連中よりは断然いい。
若い連中に知識がないのはある程度仕方ない。考え方とか方向性は合ってるから、他言語とOOPを学べば飛躍すると思うぜ。頑張れ。
2021/02/18(木) 11:38:14.57ID:1zMeI46+
>>131
その手の「プログラミングスクール誘導記事」は全部ゴミだから無視しとけ。
間違いが多すぎる。
初心者的に見分けが付かないのなら、Qiitaやここみたいに、あからさまに間違ってたら突っ込まれる場所だけにしとけ。
あと、MDNは(準)公式だから信頼してもいい。

その記事は典型的な「クラスのprivateをクロージャで」だが、クロージャはprivateを実現する為の物ではない。
むしろ、慣れれば「クロージャがない言語は糞言語だ」と断言出来るようになる。それくらい重要で便利な代物だ。
結果、C++にもJavaにも入って、メジャー言語で使えないのは最早存在しない。
同様にメジャー言語を全制覇した概念はOOP位だ。だから同程度に重要な概念だと言える。
とはいえ、本質的にはクラスとクロージャは同じ概念であり、その実装文法が異なるに過ぎない。
そしてJSは最初からそれを理解していたから、クラスも階層も関数も全部functionになってて、これも初心者が混乱する原因にはなってるが。

だからclass文法なんて使わなくてもクラス(と同等の動作をするもの)はJSでも記述出来、MDNはそうなってるだろ。
class文法はクラス脳の為の補助輪(糖衣構文)であり、本質的な事柄ではない。


と言ってもよく分からないだろうけど、今のお前のレベルからすると、
もうその辺の「プログラミングスクール誘導記事」は読むのを止めた方がいい。マジで全部ゴミだから。
MDN読んどけ。
https://developer.mozilla.org/ja/docs/Learn/JavaScript/Objects/Object-oriented_JS
https://developer.mozilla.org/ja/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。