JavaScriptにはプロトタイプがある。JavaScriptにはクラスがない。あるプロトタイプベース継承の糖衣構文です。クラスは、オブジェクトを作成して継承を扱うためのシンプルで明確な構文を用意します。あるプロトタイプベース継承の糖衣構文です。導入しているわけではありません。クラスは、オブジェクトを作成して継承を扱うためのシンプルで明確な構文を用意します。6)で導入された「クラス」は、ES5のプロトタイプベースを基にして作った「糖衣構文」(シンタックスシュガー)とのこと。ES6になっても、厳密には、JavaScriptがクラスベースのオブジェクト指向プログラミング言語に変わったわけではない。sugar)は、プログラミング言語において、読み書きのしやすさのために導入される書き方であり、複雑でわかりにくい書き方と全く同じ意味になるものを、よりシンプルでわかりやすい書き方で書くことができるもののことである。構文上の書換えとして定義できるものであるとも言える。糖衣構文はプログラムの意味としては同じものを、よりわかりやすい構文で書けるものである。MDNの説明を見ると、JavaScriptのオブジェクト指向は、クラスベースではなくプロトタイプベースと定義されていることが分かりました。私のJavaScriptに関する知識はES5で止まっており、ES6(ES2015)以降の新しい知識はほとんどありません。現時点では以下のように認識しています。Script)は、徐々にバージョンアップして、言語仕様が変わってきている。ES5以前のJSは、プロトタイプベースのOOPだった。クラスベースのOOPをエミュレートするために、一時期「Prototype.js」というライブラリーが流行っていた。ES6以降のJSでは、class構文が導入されて、クラスベースのOOPも可能になった。現状では、後方互換性を保つためにトランスパイラーを使い、ES6からES5へダウンコンパイルして使うケースが多い。レガシーコードをメンテナンスする際には、まだES5の知識が必要。Script)のバージョンJavaScriptの言語仕様は、現在ECMAScriptとして策定(標準化)されています。頭文字をとったものでした)。Internationalによって標準化されてるJavaScriptの仕様の事。MDNこのページはJavaScriptバージョン履歴の情報とFirefoxのようなMozilla/SpiderMonkeyベースのJavaScriptアプリケーションの実装状況を表示します。2015)と言います。以降ナンバリングの規則が変わり、ES2016、ES2017...となっています。Scriptの言語仕様JavaScriptの言語仕様は公開されているので、誰でも確認できます。(次期バージョン:ES2017)使用するJavaScriptのバージョン、実装によって、多少文法が異なるので注意が必要です。ES5以前のJSES5以前のJSは、プロトタイプベースのOOPであり、クラスベースのOOPではありませんでした。JSでクラスベースのOOPをエミュレートするために、「Prototype.js」というライブラリーも登場しました。Wikipedia特徴Prototypeはクラス群とクラスベースのオブジェクトのためのライブラリ関数も提供する。これはJavaScript言語にはない部分である。Railsにも採用されるなど、広く使われていました。(その後、jQueryの登場によってPrototype.jsの人気は下火になりました。ES6以降のJSES6(ES2015)で、JSにclassの糖衣構文が導入され、クラスベースのスタイルでOOPが可能になりました。モダンブラウザーは、ES6に対応しているものが増えてきましたが、まだ後方互換性を完全に無視できるほどのシェアには達していないようです。(時間の問題?)はてなブックマークやQiitaで、ES6(ES2015)の記事をザッピングしてみましょう。以上)Qiitaに解説記事がたくさんありました。概要の把握に役立ちます。JSのダウンコンパイル現状では、ES6で書いたコードをES5で動くようにするために、Babel等のトランスパイラーを使い、ES6からES5へダウンコンパイルして使うケースが多いようです。(transpile)ある言語で書いたソースコードを別の言語のそれに変換する機能。この機能をもつものをトランスパイラという。コンパイラがソースコードを吸ってバイナリを吐くのと同じように、スクリプト言語界では、トランスパイラがソースコードを吸ってソースコードを吐く。BLOGJSは、もはやインタープリター言語じゃなくてコンパイル言語になってますね!?今後のトレンド予想ES6→ES5=JSをJSで書いてコンパイルって、面倒くさくないですか?どうせコンパイルするなら、他の言語でもOKという動きが活発になるのでは?超強力なIDEが登場して、ES6を書いたら即座にES5を吐き出してくれる。他の言語をJSにトランスパイルする。asm.jsで、他の言語がJSの代わりに使えるようになる。他の代替手段も発展していきそうな気がします。WikipediaWebAssemblyは、ウェブブラウザのクライアントサイドスクリプトとして動作するプログラミング言語(低水準言語)である。wasmとも称されており、ブラウザ上でバイナリフォーマットの形で実行可能であることを特徴とする。JSのレガシーコードES5で作られているサイトは、まだまだ多いと思います。メンテナンスする際には、まだES5の知識が必要ですよね?以上、ざっとJSの現状、今後のトレンドを眺めたところで、本題に戻りましょう。プロトタイプベース以外の別名JSのオブジェクト指向について調べてみると、クラスベースプロトタイプベースの他に、オブジェクトベースインスタンスベースという用語、名称も出てきました。これらの名称には、クラスベースとの違いを明示する以上に、何か特別な意味があるのでしょうか?検索したら参考になる記事がヒットしました。id:anatooのブログ順番に見ていきましょう。Smalltalkのtは小文字です個人的には、クラスを用いないオブジェクト生成手法の話でないのならば(つまり、「プロトタイプの複製でオブジェクトを生成する」ことが話の本筋でないならば)「プロトタイプベース」ではなく、「インスタンスベース」(あるいは「オブジェクトベース」...)と言い換えることを推奨しています。クラスをインスタンス化してオブジェクトを作成。いろいろなオブジェクトの作り方がある。一例として、プロトタイプベースのOOPなら、プロトタイプをクローン(コピー)してオブジェクトを作成。議論領域の分割方法として、「クラスベース」と「非クラスベース」の2項対立では、説明できない部分(OOPの特徴)が出てくるんですね。dilemma)は非論理的誤謬の一種であり、実際には他にも選択肢があるのに、二つの選択肢だけしか考慮しない状況を指す。どんな分類がより適切なのでしょうか?最近は説明が面倒で「プロトタイプベース」で通してしまうことも多いのですが...反省。#ちなみに「インスタンスベース」や「オブジェクトベース」というのは、別に私の造語というわけではなく、論文や書籍などで比較的古くから使われている用語です。OOPの仕組みを細分化して、名前を付け、説明方法を改善することは可能?繰り返しになりますが念のため。オブジェクトがそれが属するクラスによらず独自のメソッドやインスタンス変数を持てること*こそ*が、「プロトタイプベース」あらため「インスタンスベース」の本質です。作った後:オブジェクトの性質に焦点が当てられています。言語デザインにおいて、生成方法と性質の間に依存関係がなければ、両者は直交した概念として、別々に検討できるでしょう。ここでは、オブジェクトの「性質」(振る舞い)に着目して、オブジェクトのメンバー(プロパティーやメソッド)が動的に変更(追加/削除)できる、という性質が「インスタンスベース」の持つ特徴であると定義すれば良いのでしょうか?ここで、「第1級オブジェクト」、「第1級関数」について確認しましょう。(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである。ここで「オブジェクト」とは広く対象物・客体を意味し、必ずしもオブジェクト指向プログラミングにおけるオブジェクトを意味しない。第一級オブジェクトは「第一級データ型に属す」という。言語によって異なるが、第一級オブジェクトは概ね次のような性質をもつ。無名のリテラルとして表現可能である。変数に格納可能である。データ構造に格納可能である。それ自体が独自に存在できる(名前とは独立している)。他のものとの等値性の比較が可能である。プロシージャや関数のパラメータとして渡すことができる。プロシージャや関数の戻り値として返すことができる。実行時に構築可能である。読み込むことができる。分散したプロセス間で転送することができる。実行中のプロセスの外に保存することができる。function、ファーストクラスファンクション)とは、関数を第一級オブジェクトとして扱うことのできるプログラミング言語の性質、またはそのような関数のことである。呼ばれる型を持ち、またその値は関数オブジェクトなどになる。具体的にはプログラムの実行時に生成され、データ構造に含めることができ、他の関数の引数として渡したり、戻り値として返したりすることのできる関数をいう。JavaScriptの関数は第1級オブジェクトなので、変数に代入したり、配列にセットしたり、他の関数に引き渡したりできます。関数をデータとして扱うことが可能です。JavaScriptのオブジェクトは、連想配列と同じ構造です。(JSの連想配列はオブジェクトの一種?)連想配列の要素(箱)をどんどん増やして、その中にデータや関数を入れられるように、オブジェクトのメンバーを増やしてプロパティー(データ)やメソッド(関数)を追加できます。JavaScriptのオブジェクトのメンバーは、クラス(設計図)に依存しておらず、自由に追加削除できると。JavaScriptのオブジェクトの性質については、今後JavaScriptのリフレクションの作法を学習してから、より具体的に見てみたいと思います。プログラムの実行過程でプログラム自身の構造を読み取ったり書き換えたりする技術のことを指す。日本語では自己言及と呼ばれる。一般に、リフレクションとはオブジェクトがそれ自身の構造や計算上の意味を取得することを可能にするものである。foo())[methodName]();インスタンスベースの性質や定義について、さらに見てみましょう。影響で)「クラスがない」と短絡する人が多いのも問題のひとつです。した偏った思いこみを払拭するのにも「インスタンスベース」との言い換えは有効だと思います。オブジェクトが独自のスロットを持てることと、そのオブジェクトがクラスに属することは矛盾しない、つまりインスタンスベースの言語でもクラスを持つことはできるし、逆に、クラスベース言語でも(その言語がクラスベースにおいて純粋さを目指さない限りにおいて...)そのオブジェクトにインスタンスベース的素養を持たせることは可能です。実際、完全なインスタンスベースの言語(NewtonScript、JavaScript、ActionScript)にクラスがあってもまったく問題はないわけですし、クラスベースの言語(Ruby、Python)であっても、オブジェクトがインスタンスベース的素養を持つ例はめずらしくありません。ような言語でも定義できます.インスタンスベースの特徴が明らかになってきました。インスタンスベースで生成されたオブジェクトは、クラスに属してOK=オブジェクトを型で取り扱い可能と。できるのに対し)インスタンスベースでクラスがないときに使われるオブジェクト生成のバリエーションのひとつ...という程度の位置づけにすぎず、そうでなければならないという類のものではありません。インスタンスベースとプロトタイプベースの包含関係について定義されていました。プロトタイプベースは「インスタンスベースでクラスがないときに使われるオブジェクト生成のバリエーションのひとつ」という位置づけだそうです。プロトタイプベースはインスタンスベースの真部分集合と定義されています。プロトタイプベースインスタンスベースで、クラスがあるときに使われるオブジェクトの生成=呼名は?インスタンスベースで、クラスがないときに使われるオブジェクトの生成=プロトタイプベースの2種類に分類されています。後者が「プロトタイプベース」なら、前者は区別するときに何と呼べばよいのでしょうか?=「非プロトタイプベースのインスタンスベース」を一言で示すときの名前は?ここまでの説明では、前者と後者を区別するための名前が、まだ前者に与えられていないようです。このオブジェクト生成にからめた「プロトタイプベース」関連の用語としては、「プロトタイプとクローン(コピー)」、「ペアレントとチャイルド」という用語やそれぞれの関係も混乱の元になりがちですね。これらも、オリジナルとその浅いコピーの関係なら「プロトタイプとクローン」、委譲先としての情報を持つだけなら「ペアレントとチャイルド」と統一してはどうかと個人的には思うのですが、現状、ペアレント(移譲先の)スロットを「プロトタイプ」やそれに準ずる呼称とする言語が多い(関連して「プロトタイプ・チェーン」なんて言葉があるくらいですし...)ので、難しいですね。チャイルド」というのがふさわしいということにできて一件落着なのですが、なかなかそういうわけにもいかないでしょう。JavaScriptのオブジェクト指向を「プロトタイプベース」ではなく「インスタンスベース」と呼ぶ提案は、斬新だと思います。他のプロトタイプベース言語の違いを明示これらの項目で分類表を作り、「プロトタイプベース」との差異や、包含関係を図表にしたら、分かりやすい説明方法が作れそうだと思いました。id:anatooのブログウェブ上の記事を眺めていると、JavaScriptをプロトタイプベースのオブジェクト指向言語(以下OOPと書く)と説明している例がよく散見される。この書き方は間違ってはいないかもしれないが、もはや誤解を生むだけである。JavaScriptはプロトタイプベースのOOPの中でも異端であり、本来のプロトタイプベースのOOPとはあまり似ていないからである。JavaScriptでは、new演算子を使ってオブジェクトを生成したり、prototypeオブジェクトを使ってオブジェクトのメソッドやプロパティを定義したりするが、他のプロトタイプベースのOOPではnew演算子は無いし、prototypeオブジェクトも無い。この記事では、本来のプロトタイプベースのOOPがどういったものであり、JavaScriptとはどう違うのかを説明する。他のプロトタイプベースのOOPではnew演算子は無いし、prototypeオブジェクトも無い。ここでは、プロトタイプベースのOOPの例として、ioという言語で説明する。ioは純粋なプロトタイプベースのOOPだ。ioには制御構文用の文法が無く全てが(if文ですらも)メソッドである。7つの世界」という本で紹介されているプログラム言語です。純粋なオブジェクト指向プログラミング言語であり、Smalltalk、Self、Lua、LISP、Act1、NewtonScriptの影響を受けている。ようなプロトタイプベースのオブジェクトモデルであり、オブジェクトとクラスを区別しない。ようにあらゆるものをオブジェクトとして扱い、動的型付けを行う。LISPのように文の概念がなく、制御フローは関数を使って実現される。新たなオブジェクトはクローニングで生成される。新たな空のオブジェクトが作られたとき、その親との違いだけが新しいオブジェクトに格納される。このような方式を差分継承と呼ぶ。Name"重要なことはこのMyObjectはすでに利用できる一個のオブジェクトだということだ。ここでcreateGreetingメソッドを呼び出せばそれはそのまま動作する。JavaScriptではこうはいかない。返るioでは新しくオブジェクトを作るときには、クラスをインスタンス化してオブジェクトを生成する代わりに、すでにあるオブジェクトを複製することでオブジェクトを生成する。返るさて、ioのやり方を見るとJavaScriptとはだいぶ違うことがわかる。ioなどのプロトタイプベースのOOPではオブジェクトの定義や継承や生成などの処理を全てcloneを通じて行えるので非常にシンプルだ。それに比べるとJavaScriptのprototypeオブジェクトを使うやり方は何かちぐはぐな印象を与えてくる。GoFのデザインパターンの一つにオブジェクトの生成に関わるプロトタイプパターンというのがあるが、プロトタイプベースのOOPではこのデザインパターンを言語の設計レベルで全面的に採用することでnew演算子やクラスの存在を消してしまっている。JavaScriptでは、プロトタイプ(ひな形)となるオブジェクトは関数オブジェクトのprototypeプロパティに代入したオブジェクトになるが、これは通常のオブジェクトとしてそのまま利用できるわけではないし、これはある意味クラスを表現するクラスオブジェクトのような形になっている。ioではそういったオブジェクトは無くプロトタイプ(ひな形)となるのはそのオブジェクト自身である。ioではオブジェクトの複製を通じてのみ新しいオブジェクトを生成できる。やって書いてみると、JavaScriptが通常のプロトタイプベースのOOPとどれほどかけ離れているかがわかる。JavaScriptはクラスを持たないためプロトタイプベースのOOPとして分類できるのかもしれないが、その仕組みを観察してみると、クラスベースとプロトタイプベースの合いの子のような妙な形になっている。ioという具体的なプログラミング言語を挙げて考察しており、分かりやすい説明だと思いました。ioとJavaScriptの比較項目オブジェクトの生成方法オブジェクトの性質(振る舞い)「io」は、とてもスッキリした仕組み!「io」のOOPを「純粋なプロトタイプベース」と呼ぶなら、JSのOOPの方式は別の名称で区別した方が良いかもしれませんね?混乱を招かないなら、「オブジェクトベース」とか「インスタンスベース」を新名称として採用し、意味をシッカリと定義すれば良いでしょう。他の言語との兼ね合いで、「オブジェクトベース」「インスタンスベース」という名称だと、別の混乱を招くとしたら、今までにない新しい名前を付けるべきでしょう。JS界隈で検討してください。最近、「フェイクニュース」(偽のニュース)という言葉をよく聞きますが、人の話は鵜呑みにせず、自分で確かめることが大事ですね?当たり前だと思っていることでも、別の角度から見たら、違う風景・姿が見えてきます。「開発者やみんながそう言ってるから」という理由で、今までJavaScriptのOOPは「プロトタイプベース」と呼んできました。世の中にはいろいろなプログラミング言語が存在しているので、混乱は避けるべきです。齟齬を生じさせないためにも、「プロトタイプベース」という用語の意味を再定義して、より厳密な説明に使えるように、概念を細分化/再構築した方が良いと思いました。〈AERA〉|d...https://dot.asahi.com/aera/2016102500219.html「プログラミング教育」は、2020年度から日本の小学校計約2万校で必修化される。同時に、これまで単なる「外国語活動」だった小学5、6年生の英語が「教科」に格上げされ、年間の授業時数も倍増。3、4年生も...もしも、本記事をJavaScriptのガチ勢(ベテラン)さんが読まれましたら、「プロトタイプベース」という用語の用法について再検討/再定義して、分類表や図を作り、より分かりやすい説明をMozillaに提案していただけたらと思います。\(丸投げ)/「Aは間違っている」→「AではなくBが正しい」=代替案のない批判は片手落ちです。使うのに問題があったりする場合、ここが正しい場所です。コミュニティに占める部分は多くなり、私たちはその前にあなたの関心に感謝しています。あなたの洞察を提供するにはいくつかの選択肢があります。この記事は選択するのに役立ちます。まとめ現状では、JavaScriptのオブジェクト指向は「プロトタイプベース」という名称で説明しておく。(理由:Mozilla自身がそう言ってるから。)ただし、異論が出されたら「io」など他のプロトタイプベースの言語と比較するとJavaScriptの仕組みはちょっと違う、という説明もしておく。状況を整理して、図表などを作り、Mozillaに新名称を提案してみる。JavaScriptのオブジェクト指向の方式について、Mozillaが新名称を採用し発表したら、その後は新名称を使えばOK。engineer-log.net関連記事プログラミング学習で擬似コードを活用しよう!JavaScript学習に役立つお話がありました。「擬似コード」でロジックを書き出す練習について紹介されています。JavaScriptに限らず、プログラミングの基本を学んだら何か動くモノ(プライベートプロジェクト)を作ってみたくなります。現実には、プロジェクトは完璧なコードをガンガン書くことではなく、たくさんの試行錯誤とリファレンスを幾度も参照して少しずつできあがるものなのです。アプリ作成の進め方として、以下の手順が紹介されています。コード無しで書いてい...記事を読むプロトタイピング=試作品の制作を気軽に始めてみよう!JavaScript学習に役立つお話がありました。「プロトタイピング」でプログラムを試作する練習について紹介されています。(前回に引き続き、今回もこのお話から学んでみたいと思います。アプリ作成の進め方として、以下の手順が紹介されています。Macには、操作を自動化できるAppleScriptという道具が用意されています。このAppleScriptの代わりに、JavaScriptも使えるようになっていました。AppleScriptの代わりにJavaScriptを使えるようになってました。Yosemiteからの新機能だそうです。JXAとも呼ばれています。AppleScript(アップルスク...記事を読むWebpackerを使ったRailsでのJavaScript開発こんにちは。マーケティングプロダクト開発部の長田です。この記事では、私が現在進めているプロジェクトで、Webpackerを使ったJavaScriptのモジュール管理を導入したので、それについて紹介したいと思います。organizationで開発されているgemです。Interface)とは?JavaScript学習で、ときどき「API」という用語が出てきます。APIについてまとめておきます。W...記事を読むWordPressパフォーマンスチューニング(1)WordPressパフォーマンスチューニング方法を紹介します記事を読むWindowsでMochaテストフレームワークを使うJavaScriptの学習メモ。JavaScriptを使って学ぶ」の第9章を読んでみます。Model)とは?JavaScript学習で、「DOM」という用語がよく出てきます。DOMについてまとめておきます。DOM...記事を読むCSSセレクターとは?JavaScript学習で、「CSSセレクター」という用語がたまに出てきます。CSSセレクターについてまとめておきます。Sheets、カスケーディング・スタイル・シート)とは、ウェブページのスタイルを指定するための言語です。CSSは、HTMLと組み合わせて使用する言語です。HTMLがウェブページ内の各要素の意味や情報構...記事を読むJavaScriptで継承を使わないプログラミングスタイルJavaScriptでは「継承による差分プログラミング」はモダンではない、という意見がありました。うへええええ継承による差分プログラミングとか現代に言わないでくれよ。