新しい章を始め、この章が始まり、すべての内容は非常に貴重で有意義です。この章では、リテラルのオブジェクト、コンストラクタ、配列リテラル、正規のリテラル、リテラル値の型など、基本的なJSONを含んでいます。みんなの仕事や実用的なアプリケーションでも、いくつかの意味を持ちます。
まず、オブジェクトリテラル
私たちは、直接コードを見て:
// ヌル・オブジェクトが定義されているときに開始 するvar犬= {}; // 犬対象に属性を追加 dog.name =「ベンジー」; // 次に、イヌにオブジェクトを追加する方法 dog.getName = 関数(){ 戻り犬.nameの; }; // 上記の例では、犬オブジェクトがクリーンな状態であることを開始する、すなわち、空のオブジェクト(ここでは、空のオブジェクトは、加えて、属性の継承を意味しない独自の属性を行います)。 // あなたがオブジェクトとメソッドに属性を追加することができます。いつでもプログラムのライフサイクルでは、次の操作を実行することができます。 //は、属性およびメソッドの値を変更: dog.getName = 関数(){ // メソッドの戻り再定義 // 戻りハードコード化された値の リターン「ファイドを」; }; // 完全プロパティ/メソッドを削除: 削除犬。名前; //追加のプロパティとメソッドを追加します。 dog.say = 関数(){ リターン "ウーフ!" ; }; Dog.fleasは = trueに。
もちろん、空のオブジェクトを起動する必要はありません。オブジェクトリテラルモードでは、オブジェクトを作成するときに機能を追加することができます:
VaRの犬= { 名: "ベンジー" 、 のgetName:関数(){ 戻り 、この.nameのを、 } }。
例として、次のように[OK]を、上記、標準オブジェクトリテラル文言オブジェクトリテラル構文は次のとおりですされています。
1は、括弧でラップされたオブジェクトを打ちます。
図2に示すように、オブジェクトのプロパティとメソッドカンマ区切り。最終的な名前で - 末尾のカンマ値許可されていますが、いくつかの特別なブラウザで文句を言うので、そうしようとします。
3、コロンと属性で区切られた属性名の値を持ちます。
変数への代入値は、閉じ括弧の後にセミコロンを忘れないでください4、「}。」
オブジェクトコンストラクタから
オブジェクトを作成する方法で見てみましょう:
// 最初の方法::リテラルを使用 するvar = {行く:「FAR」CAR }; // 別の方法:構築されたコンストラクタを使用して-これは、サブトラクティブモードで、使用しないでください! VAR CAR = 新しい新しいオブジェクト(); car.goes = "FAR"。
上記のオブジェクトを作成するには2つの方法は、特に、オブジェクトを作成するために、組み込みコンストラクタを使用しないように注意してください。リテラルは、文字を入力するには、それが作られていること短いだけ必要として重要な利点を表しています。別の理由優先リテラルモードは、そのオブジェクトを作成することが唯一の目的は、ハッシュマップ変数ではなく、被験者から抽出するためのプロパティまたはメソッドであることを強調しています。
オブジェクトコンストラクタの手を使用して、もう一つの理由は、リテラルの使用があるということ、それはスコープを解決しません。それは同じ名前を持つローカルコンストラクタを作成することができるので、インタプリタは、プロパティまたはメソッドがオブジェクトから抽出されたのではなく、スコープチェーンアップオブジェクト()を呼び出し位置から照会された開始しなければなりません。
オブジェクトコンストラクタキャプチャ
私たちは、オブジェクトを作成するために、Objectコンストラクタを使用しませんが、我々は、オブジェクトのコンストラクタの「機能」を理解する必要があります。ここで、オブジェクト()コンストラクタはパラメータのみを受け入れ「署名」を意味し、また、転送の値に依存して、他の組み込みコンストラクタに委任することができるオブジェクト()オブジェクトを作成し、戻ることは望ましくないとします異なるオブジェクト。
// 以下のアンチパターン // 空のオブジェクト のvar O = 新しい新しいオブジェクト() はconsole.log(o.constructor ===オブジェクト); // trueに // 目標値 VARの O = 新しい新しいオブジェクト(1 ) コンソール.logの(o.constructor ===ナンバー); // trueに はconsole.log(o.toFixed(2)); // "1.00" // 文字列オブジェクト のvar O = 新しい新しいオブジェクト( 'I AM文字列' ); にconsole.log(o.constructor ===文字列); // trueに // 一般的な目的とサブストリングではない()メソッド //しかし、この方法では、Stringオブジェクトを持っている (にconsole.log typeof演算 o.substring); // "機能" // Booleanオブジェクトの VARの O = 新新(オブジェクト真の); はconsole.log(o.constructor ===ブール)。// trueに
私たちは、上記のコードを参照してください新しいオブジェクト()コンストラクタに数値、文字列、ブール値を渡す、得られた結果は、作成されたオブジェクトのコンストラクタは異なっています。実際には、ビルトインのObjectコンストラクタの実際の実装が作成されていない、Booleanオブジェクトを作成するために、最後の1をあるテイク()が、オブジェクト()コンストラクタは、任命ブール(作成)の。
オブジェクトに渡された場合には()コンストラクタは、動的な値であり、そしてこの動作は、予期しない結果を引き起こす可能性があり、実行時、オブジェクト()コンストラクタまで、そのタイプを決定します。、最後に再びそれを言うので、新しいオブジェクト()コンストラクタを使用しないでください!
第二に、カスタムコンストラクタ
オブジェクトリテラルモードと内蔵のコンストラクタに加えて、あなたは、オブジェクトを作成するために、独自のコンストラクタを使用することができます。
VaRのアダムは= 新しい人( "アダム" ); adam.say();
ここの人は、それだけの機能です。
VAR人= 関数(名前){ この .nameの= 名前。 この .say = 機能(){ リターン +「私は」この.nameの。 }。 }。
new演算子は、コンストラクタを呼び出す場合は、以下の内部関数が発生します。
1.空のオブジェクトと、この変数を作成する関数のプロトタイプ継承し、オブジェクトを指します。
図2に示すように、このプロパティとメソッドを参照に加えました。
(ノーリターン他のオブジェクトが表示されない場合)図3は、最終的にこの参照により、新しく作成されたオブジェクトは、この暗黙返します。
次のようになります。
VAR人= 関数(名前){ // リテラルモードオブジェクトを使用して、新しいオブジェクトを作成する // VARこの= {}; // これにプロパティとメソッドを追加 この .nameの= 名; この ... SAY = 関数(){ リターン "I AM" + この.nameの; }; // 戻りますこの; };
上記の例では、簡単のため、この中に言う()メソッドを追加します。その原因の結果は、いつでも新しい人を()を呼び出す際には、メモリ内の新しい関数を作成します。明らかに、この方法の効率は、複数のインスタンス(の間と言う、非常に低い)メソッドは、実際に変更されない、より良いオプションは、Personクラスのプロトタイプにメソッドを追加することです。
Person.prototype.say = 関数(){ リターン + "私は" この.nameの }
このような再利用可能な方法などの問題、再利用可能なメンバーは、オブジェクトのプロトタイプの上に置かれるべきであることが強調されるべきです。
注:
// VARこの= {};
このコードは真実ではありません。「空」のオブジェクトが実際に空にされていないので、それはプロトタイプ人の原型から多くのメンバーを継承しています。したがって、それはより多くの次の文のようなものです:
// VARこの= Object.create(Person.prototype)。
Object.createはさらに次コンテンツに説明します。
コンストラクタ関数の戻り値
オブジェクトを作成するために、new演算子を使用する場合は、オブジェクトのコンストラクタ関数は常に返します;デフォルトは返すことです。このことにより、参照されるオブジェクトを。これはコンストラクタに戻り、「ヌル」オブジェクトに属性を追加しない場合は(本明細書空、コンストラクタのプロトタイプメンバーから継承に加えて意味します)。
コンストラクタが暗黙のうちに、これを返す関数でreturn文を追加するのもない現実だろう。必要に応じて、しかし、あなたは他のオブジェクトを返すことができます。例えば:
VAR Objectmaker = 機能(){ // 以下の「name」属性は無視されます // これは、他のオブジェクトへのコンストラクタの戻りが決定しているためである 。この .nameのを=「これだ」; // 作成し、新しいオブジェクトを返します VAR =その; {} that.name = "そして、そのことAPOS" ; リターンその; } // テスト するvar O = 新しい新しいObjectmaker(); にconsole.log(o.name)。
上記から分かるように、自由に長尺物であるコンストラクタ、任意のオブジェクトを返します。これは、エラーは発生しませんが、オブジェクトの値を返すようにしようとしますが、関数は、それは単にこの値を無視しないで、逆に、コンストラクタは、このオブジェクトが参照されて返されます。
さて、今日はここで終わりに満足しています。当時の記事の内容が長すぎる防ぐために続けています。