機能詳細②-(プロトタイプチェーンプロパティ、インスタンス、プロモーション、実行コンテキスト)

プロトタイプチェーンプロパティの問題

  1. オブジェクトのプロパティ値を読み取る場合:プロトタイプチェーンで自動的に検索されます
  2. オブジェクトのプロパティ値を設定する場合:プロトタイプチェーンは検索されません。現在のオブジェクトにこのプロパティがない場合は、このプロパティを直接追加して値を設定してください。
  3. メソッドは通常、プロトタイプで定義され、プロパティは通常、コンストラクターを介してオブジェクト自体で定義されます。

上記のルールは、次の例から見つけることができます。

  function Fn() {
    
    

  }
  Fn.prototype.a = 'xxx'
  var fn1 = new Fn()
  console.log(fn1.a)  //xxx

  var fn2 = new Fn()
  fn2.a = 'yyy'
  console.log(fn1.a, fn2.a)  //xxx  yyy

fn2の場合:
ここに画像の説明を挿入

instanceof

  1. instanceofはどのように判断されますか?
  • 式:Bのインスタンス
  • Bコンストラクターの明示的なプロトタイプオブジェクト(プロトタイプ)がAオブジェクトのプロトタイプチェーン上にある場合(つまり、交差がある場合)はtrueを返し、そうでない場合はfalseを返します。
  1. 関数は、new自体によって生成されたインスタンスです

次の2つの例からinstanceofを理解できます
。①

  /*
  案例1
   */
  function Foo() {
    
      }
  var f1 = new Foo()
  console.log(f1 instanceof Foo) // true
  console.log(f1 instanceof Object) // true

ここに画像の説明を挿入
プロトタイプチェーンは暗黙のプロトタイプチェーンとも呼ばれるため、接続として__proto__を使用し、ノードとしてプロトタイプを使用するライン、つまりプロトタイプチェーンに注意を払う必要があります。

  /*
  案例2
   */
  console.log(Object instanceof Function) // true
  console.log(Object instanceof Object) // true
  console.log(Function instanceof Function) // true
  console.log(Function instanceof Object) // true

  function Foo() {
    
    }
  console.log(Object instanceof  Foo) // false

ここに画像の説明を挿入

可変巻上および機能巻上

  1. 変数宣言の巻き上げ
  • varを介して定義(宣言)された変数は、定義ステートメントの前にアクセスできます。
  • 値:未定義
  1. 関数宣言の巻き上げ
  • 関数を介して宣言された関数は、直前に呼び出すことができます
  • 値:関数定義(オブジェクト)

確認:

<script type="text/javascript">
  console.log('-----')
  /*
  面试题 : 输出 undefined
   */
  var a = 3
  function fn () {
    
    
    console.log(a)
    var a = 4
  }
  fn()

  console.log(b) //undefined  变量提升
  fn2() //可调用  函数提升
  // fn3() //不能  变量提升

  var b = 3
  function fn2() {
    
    
    console.log('fn2()')
  }

  var fn3 = function () {
    
    
    console.log('fn3()')
  }
</script>

必要なポイントがあります:

var fn3 = function () {
    
    
    console.log('fn3()')
  }

このように宣言された関数は、関数としてではなく、変数として持ち上げられます。関数の巻き上げが必要な場合は、関数宣言のみを使用できます。

実行コンテキスト

①コード分類(場所)

  • グローバルコード
  • 関数(ローカル)コード

②グローバル実行コンテキスト

  • グローバルコードを実行する前に、ウィンドウをグローバル実行コンテキストとして決定します
  • グローバルデータの前処理
    • var ==> undefinedで定義されたグローバル変数、windowのプロパティとして追加
    • 関数==>割り当て(fun)によって宣言されたグローバル関数、ウィンドウのメソッドとして追加
    • this ==> Assignment(window)
  • グローバルコード実行を開始します

③関数実行コンテキスト

  • 関数を呼び出して関数本体を実行する準備をする前に、対応する関数実行コンテキストオブジェクト(仮想、スタック内に存在し、外部からは見えない閉じた領域)を作成します。
  • ローカルデータの前処理
    • 正式なパラメータ変数==>割り当て(実際のパラメータ)==>実行コンテキストとして追加された属性
    • 引数==>割り当て(引数のリスト)、実行コンテキストのプロパティとして追加
    • var ==> undefinedで定義されたローカル変数、実行コンテキストのプロパティとして追加
    • 関数によって宣言された関数==>代入(fun)、実行コンテキストとして追加されたメソッド
    • this ==> Assignment(オブジェクト呼び出し関数)
  • 関数本体コードの実行を開始します

おすすめ

転載: blog.csdn.net/zyb18507175502/article/details/124211493