http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.html
Javascriptの言語は、「クラス」をサポートしていませんが、シミュレートするために、いくつかの代替方法を使用することができます「クラスを。」
コンストラクタメソッド
これは古典的な方法ですが、また、教科書の方法をお教えします。それは、「クラス」アナログコンストラクタを使用して、その内部でインスタンスにこのキーワードを使用することを指します。
関数キャット(){ この .nameの= "大毛" 。 }
新しいキーワードを使用して、インスタンスを生成するとき。
VaRの CAT1 = 新しい新しい猫(); 警告(cat1.name); // OVO
クラスのプロパティとメソッドは、また、プロトタイプオブジェクトのコンストラクタで定義されてもよいです。
Cat.prototype.makeSound = 関数(){ アラート( "喵喵喵" )。 }
この方法の詳細については、私が書いた一連の記事を参照してください「JavaScriptのオブジェクト指向プログラミング」を言っても過言でありません、。その主な欠点は、非常に骨の折れるより複雑であり、このプロトタイプを使用して、読み書き。
二、Object.create()メソッド
「コンストラクターメソッド」の欠点に対処するためには、より簡単なオブジェクトは、JavaScriptの国際標準生成するのECMAScript第5版を(現在、第三版に広がる)、新方式提案Object.create() 。
この方法では、「クラス」はオブジェクト、関数ではなく。
VaRの猫= { 名: "卵" 、 MakeSound:関数(){アラート( "ニャーニャー" );} };
その後、インスタンスを生成するためにObject.createの直接使用()、新しいを使用する必要はありません。
VaRの CAT1 = Object.create(猫); 警告(cat1.name); // OVO cat1.makeSound(); // ニャーニャー
現在、(IE9を含む)の主要なブラウザの最新バージョンでは、この方法を導入しました。あなたは古いブラウザを使用している場合、あなたは自分の展開に次のコードを使用することができます。
もし(!Object.create){ Object.create = 機能(O){ 関数F(){} F.prototype = O。 返す 新しい)F(; }。 }
この「コンストラクターメソッド」シンプルですが、達成することができず、プライベートメソッドプライベートプロパティ、オブジェクトのインスタンスがデータを共有することができない間、アナログ「クラスは」十分に包括的ではありません以上の方法は。
第三に、ミニマリストの法則
ガボール・デ・Mooijが提案されているオランダのプログラマ)Object.createよりも良い(新しいメソッド、彼は「ミニマリストの法則」(ミニマリスト的なアプローチとして、このアプローチを言いました)。これは私がお勧めの方法です。
3.1パッケージ
このメソッドは、このプロトタイプは、コードは、おそらくそれは「ミニマリストの法則」と呼ばれている理由である、デプロイするために非常に簡単です使用していません。
まず、それが持つオブジェクトのシミュレーションである「クラス。」そこに、このクラスでは、CreateNewは、インスタンスを生成するために、)(コンストラクタを定義します。
VaRの猫= { createNew:関数(){ // ここでいくつかのコード } }。
次に、オブジェクトのインスタンスを定義CreateNew()、戻り値としてオブジェクトのインスタンスです。
VaRの猫= { createNew:関数(){ VARの猫= {}; cat.name = "大毛" 。 cat.makeSound = 関数(){アラート( "喵喵喵" )。}。 リターン猫。 } }。
使用中、createNew()メソッドを呼び出すと、あなたは、オブジェクトのインスタンスを取得することができます。
VaRの CAT1 = Cat.createNew(); cat1.makeSound(); // ニャーニャー
この方法の利点は、容易に従来の構成「オブジェクト指向プログラミング」に沿って、明確かつエレガントな構成を理解されるので、容易に次の機能を展開することができます。
3.2継承
実装が容易、クラスが別のクラスから継承してみましょう。限り前者createNew()メソッドのように、後者createNew()メソッドを呼び出すことができます。
動物は、クラスを定義します。
VAR動物= { createNew:関数(){ VARの動物= {}; animal.sleep = 関数(){アラート( "睡懒觉" )。}。 返す動物を、 } }。
その後、キャッツcreateNew()メソッドでは、createNew動物の()メソッドを呼び出します。
VaRの猫= { createNew:関数(){ VARの猫= Animal.createNew()。 cat.name = "大毛" 。 cat.makeSound = 関数(){アラート( "喵喵喵" )。}。 リターン猫。 } }。
Catインスタンスがこのようにして得られた、それはCatクラスと動物のクラスを継承します。
VaRの CAT1 = Cat.createNew(); cat1.sleep(); // 嘘
3.3プライベート属性とプライベートメソッド
CreateNew()メソッドでは、限り猫は、オブジェクトのメソッドとプロパティで定義されていないとして、プライベートです。
VaRの猫= { createNew:関数(){ VARの猫= {}; VaRの音= "喵喵喵" 。 cat.makeSound = 関数(){警報(音); }。 リターン猫。 } }。
サウンド実施形態の内部変数は、)、外部からの読み取りのみmakeSound猫(publicメソッドで読み取ることができません。
VaRの CAT1 = Cat.createNew()。 警告(cat1.sound)。// 未定義
3.4データ共有
時々、私たちは読み、内部のデータを書き込むことができ、オブジェクトのすべてのインスタンスにする必要があります。この時間は、限りオブジェクトクラスにカプセル化された内部データとして、外部CreateNew()メソッドとすることができます。
VaRの猫= { 音: "喵喵喵" 、 createNew:関数(){ VARの猫= {}; cat.makeSound = 関数(){アラート(Cat.sound)。}。 cat.changeSound = 関数(
cat2.changeSound( "ラララ" ); cat1.makeSound(); // ラララ
){Cat.soundの=のX。}。 リターン猫。 } }。
その後、オブジェクトは、2つのインスタンスを生成します。
VaRの CAT1 = Cat.createNew()。 VaRの CAT2 = Cat.createNew()。 cat1.makeSound(); // 喵喵喵
オブジェクトのインスタンスがある場合、この時点で、共有データを変更し、オブジェクトの別のインスタンスにも影響されるであろう。
(終わり)
ます。https://www.cnblogs.com/JoannaQ/archive/2013/02/15/2912661.htmlで再現