ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptの暗黙的呼び出しの詳しい説明

JavaScriptの暗黙的呼び出しの詳しい説明

小云云
小云云オリジナル
2018-02-10 14:32:042083ブラウズ

いわゆる暗黙的呼び出しとは、単にいくつかのメソッドを自動的に呼び出すことを意味し、これらのメソッドはフックのように外部から変更でき、それによって確立された動作を変更できます。

以下に私が最近見た暗黙的な呼び出しをいくつかリストします。例は要点だけを示しています。

Sting と valueOf へのデータ型変換を追加します。

等価演算子の操作では、オブジェクトが最初に呼び出します。 valueOf 戻り値がオブジェクトの場合、null を除く toSting が呼び出され、戻り値が比較に使用されます。最初の例は 3 == '2' と同等であり、2 番目の例は due を返します。 valueOf.object を実行してから toString を実行すると、最終的に '2' == '2' と同等になり、true が出力されます

Number メソッドと String メソッドでは、Number が最初に valueOf を呼び出し、次に toString In を呼び出します。 String メソッドの場合はその逆です。
上記の 2 つの例に加えて、データ型変換は数値演算など、他のさまざまな演算にも存在します。オブジェクトがオブジェクトである限り、valueOf メソッドまたは toString メソッドが呼び出されます。これら 2 つのメソッドを継承して、DOM2 イベントのデータ型変換

handleEvent の動作に影響を与えるために再オーバーライドできます

var obj = {
      a: 1,
      toString: function () {
        console.log('toString')
        return '2'
      },
      valueOf: function () {
        console.log('valueOf')
        return 3
      }
    }
    console.log(obj == '2'); //依次输出 'valueOf' false
    console.log(String(obj));//依次输出 'toString' '2'

そのとおり、addEventListener の 2 番目のパラメーターは関数に加えてオブジェクトにすることもできます。イベントがトリガーされた後に実行されるオブジェクトの handleEvent メソッド。このメソッドが実行されると、eventObj をポイントし、eventObj オブジェクトに渡したいデータをバインドできます

JSON オブジェクトを JSON

var obj = {
      a: 1,
      toString: function () {
        console.log('toString')
        return '2'
      },
      valueOf: function () {
        console.log('valueOf')
        return {} //修改为对象
      }
    }
    console.log(obj == '2'); //依次输出 'valueOf' 'toString' true
    console.log(Number(obj));//依次输出 'valueOf' 'toString' 2

JSON の stringify メソッドによって渡されたオブジェクトに toJSON メソッドがある場合、そのメソッドによって実行されたオブジェクトは、toJSON の実行後に返されるオブジェクトに変換されます。上記のステートメントでは、エラーが予期したものであることは明らかですが、これを直接返すと、エラーはまったく報告されません。toJSON によって返されたオブジェクトと元のオブジェクトの間の内部比較について大胆に推測することもできます。等しい場合は、Promise オブジェクトの元のオブジェクトを直接使用します

then

var eventObj = {
      a: 1,
      handleEvent: function (e) {
        console.log(this, e);//返回 eventObj 和 事件对象
        alert(this.a)
      }
    }
    document.addEventListener('click', eventObj)
Promise.resolve メソッドがオブジェクトを渡すとき、then メソッドがあれば、その then メソッドを即座に実行するのと同じです。 Promise.resolve にこの動作があることに加えて、Promise.all にもこの動作があります

var Obj = {
      a: 10,
      toJSON: function () {
        return {
          a: 1,
          b: function () {
          },
          c: NaN,
          d: -Infinity,
          e: Infinity,
          f: /\d/,
          g: new Error(),
          h: new Date(),
          i: undefined,
         
        }
      }
    }
    console.log(JSON.stringify(Obj));
    //{"a":1,"c":null,"d":null,"e":null,"f":{},"g":{},"h":"2018-02-09T19:29:13.828Z"}

オブジェクト属性アクセサーの get および set

 var Obj1 = {
      a: 10,
      toJSON: function () {
        console.log(this === Obj1);//true
        return this
      }
    }
    console.log(JSON.stringify(Obj1));//{"a":10}
私の年齢は何ですか?属性アクセスを行う際には、実際にオブジェクト属性の対応するget set関数が呼び出されます

 var Obj2 = {
      a: 10,
      toJSON: function () {
        console.log(this === Obj2);//true
        return {
          a: this
        }
      }
    }
    console.log(JSON.stringify(Obj2));//报错 Maximum call stack size exceeded

ここで入力の値を取得します。 obj.age の属性値と、span の innerHTML 値はすべて一緒にバインドされています

トラバーサー インターフェイス Symbol.iterator

var obj = {
      then: function (resolve, reject) {
        setTimeout(function () {
          resolve(1000);
        }, 1000)
      }
    }
    Promise.resolve(obj).then(function (data) {
      console.log(data);// 延迟1秒左右输出 1000
    })
スプレッド演算子が呼び出されるたび、または for...of ループが使用されて、オブジェクトの場合、そのオブジェクトは Array、String、Map、Set、TypedArray などの Traverser インターフェイスと呼ばれます。また、arguments や NodeList などの一部の配列のようなオブジェクトには、ネイティブに Traverser インターフェイスがありますが、通常のオブジェクトは必要に応じてこのインターフェイスをデプロイしません。オブジェクトがスプレッド演算子または for ...of ループを使用できるようにするには、このメソッドをオブジェクトに追加するか、インターフェイスを使用して元のオブジェクトのメソッドを書き換えて、その動作を変更することができます。

関連する推奨事項:

php、サブクラスが親クラスのメソッドを暗黙的に呼び出す方法

以上がJavaScriptの暗黙的呼び出しの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。