参照タイプ
リファレンスタイプには、主に以下が含まれます。オブジェクトタイプ、配列タイプ、日付タイプ、regexpタイプ、関数タイプなど。
参照タイプを使用する場合、オブジェクト(インスタンス)をそれらから生成する必要があります。つまり、参照タイプはテンプレートに相当します。特定の参照タイプを使用する場合は、このテンプレートを使用して使用するオブジェクトを生成する必要があるため、参照タイプはオブジェクト定義と呼ばれることもあります。
たとえば、誰かの個人情報と行動を定義するために人オブジェクトを生成する必要があるため、オブジェクトタイプに依存する必要があります。
var person = new object(); person.name = "jiangshui"; person.sayname = function(){console.log(this.name);}上記のオブジェクトは、オブジェクトタイプを使用して新しい演算子を使用して「テンプレート」によって定義されます。その後、このオブジェクトに属性名とメソッドSayNameを追加できます。プロパティとメソッドはオブジェクトタイプの「関数」であるため、オブジェクトなどの参照タイプを介して作成されたオブジェクトを使用できます。
オブジェクトを作成しても、必ずしも新しいオペレーターの使用が必要ではありません。作成を簡素化できるタイプがいくつかあります。たとえば、上記のようなタイプオブジェクトのオブジェクトを作成すると、次の2つの方法を使用することもできます。
var person = {}; person.name = "jiangshui"; person.sayname = function(){console.log(this.name);}または
var person = {name: "jiangshui"、sayname:function(){console.log(this.name); }};{}演算子の関数は、new Object()と同じであり、操作を簡素化します。上記の2つの執筆方法にはいくつかの違いがあります。 1つ目は「追加」です。つまり、前の定義では、属性またはメソッドを追加し続けます。同じ名前の属性メソッドが以前に既に存在する場合、上書きされます。 2番目のタイプは「交換」です。つまり、人オブジェクトのプロパティとメソッドが以前に定義されているかどうかに関係なく、この方法は、以前に定義されたコンテンツを新しく定義されたコンテンツに置き換えます。参照タイプによって生成されたオブジェクトはメモリに保存された領域であり、そのポインターが特定の変数(人)に保存されるため、2番目の執筆方法は新しいオブジェクト(新しいメモリ領域)を生成し、人変数を新しいメモリ領域に向けることです。これを理解することは、後の理解にとって非常に重要です。
他の参照タイプの使用法は、アレイタイプなど、ほぼ同じであり、オブジェクトを生成したり、直接定義したりするために使用できます。配列オブジェクトを生成した後、情報コンテンツを配列の形式で保存できます。さらに、オブジェクトは、プッシュ、シフト、ソートなどの配列タイプで定義されたメソッドを取得し、次のようなこれらのメソッドを呼び出すことができます。
var colors = []; colors.push( 'red'、 'green'); console.log(colors);
上記のコードは、配列タイプを介して配列タイプのオブジェクトを作成し、次にアレイタイプで以前に定義されたプッシュメソッドを呼び出し、オブジェクトに2つの値を追加し、最後にコンソールに印刷すると表示できます。
メソッドを呼び出して適用します
これらの2つの方法は、関数タイプによって提供されます。つまり、機能で使用できます。コールの関数は、適用方法と同じです。つまり、関数動作の範囲を拡張できることです。違いは、呼び出しを使用する場合、関数に渡されたパラメーターは1つずつリストする必要がありますが、適用方法はそれを使用しないことです。このようにして、あなたはあなた自身の機能の要件に従って通話を使用するか、適用することを決定することができます。
拡張関数操作の範囲はどういう意味ですか?あなたは例を挙げて理解するでしょう。
この方法では、関数がコンテナ(スコープ)に包まれていることを理解でき、この容器にはいくつかの変数や他のものがあります。関数が実行されると、これらの変数は呼び出されます。この容器は、実際には大きな容器を屋外に包みます。現在の小さなコンテナにそれがない場合、関数は大きな容器などで検索され、最大のコンテナウィンドウオブジェクトを見つけます。ただし、関数が現在の小さなコンテナで実行されている場合、対応する変数などがあります。小さな容器には、大きな容器でさえ、関数はそれを独自の容器で呼び出します。
通話および適用方法は、この問題を解決し、コンテナの制限を突破することです。前の例については:
var person = {name: "jiangshui"、sayname:function(){console.log(this.name); }};Chromeコンソールを開いた後、貼り付けて実行してから、person.sayname()を実行して表示します
現時点では、人は容器であり、SayNameメソッド(機能)を作成します。実行するときは、人の範囲の下で実行する必要があります。下部に直接実行されると、つまり、ウィンドウの範囲の下で実行されると、saynameメソッドがウィンドウの下に定義されていないため、エラーが定義されません。内部のこのポインターは特別なものであり、現在の範囲を示しています。 this.nameの意味は、現在の範囲の下の名前値を呼び出すことです。
次に、ウィンドウオブジェクトに名前属性を追加します。
window.name = "yujiangshui";
または直接
name = "yujiangshui";
ウィンドウは最大の容器であるため、ウィンドウは省略できます。すべての定義された属性または変数がウィンドウに添付されます。あなたがそれを信じないなら、あなたは見ることができます:
次に、窓の大きな容器の下にある小さな容器でsaynameメソッドを実行したいと思います。 SayNameメソッドの範囲を拡張するには、通話を使用するか、適用する必要があります。次のステートメントを実行します。
person.sayname.call(window);
または
person.sayname.call(this);
出力の結果は同じです。このデモは単純すぎてパラメーターを渡す必要がないため、適用されるためにApplyを使用することもできます。
上記のコードを説明させてください。 SayNameは、最初に関数タイプのインスタンスであり、呼び出しメソッドとApplyメソッドがあります。通話および適用方法は関数メソッドであるため、person.sayname()。呼び出し(ウィンドウ)などの代わりに、person.sayname.call(ウィンドウ)をこのように呼び出す必要があります。
次に、呼び出しと適用メソッドのパラメーターはスコープ(オブジェクト)であり、前の関数が渡されたスコープの下で実行されることを示します。ウィンドウオブジェクトを渡した後、saynameメソッドのnameはwindow.nameを指しているため、スコープが拡張されます。
なぜ窓とこれは同じ効果があるのですか?この関数を実行する現在の場所はウィンドウであるため、前述のように、このポインターは現在のスコープを指しているため、このポインターはウィンドウを指しているため、ウィンドウに等しくなります。