JS 関数とコンストラクタを簡単に理解する

JS 関数とコンストラクタを簡単に理解する

1. 概要

Function 、関数を作成するために使用できるコンストラクターです。作成された関数は Function オブジェクトです。実際、作成にどのメソッドが使用されたとしても、それは Function オブジェクトです。本質的に、関数名は単なる変数名であり、Function オブジェクトへの参照を指します。

認証コードは次のとおりです。

var f = 関数() {
  console.log('これはf関数です');
}
// 関数もオブジェクトです console.log(f instanceof Object); // true
// 関数は Functionconsole.log(f instanceof Function); の型のオブジェクトです。 // true

1.1 Functionコンストラクタを使用して関数を作成する

Function **** コンストラクターは新しい Function オブジェクトを作成します。このコンストラクターを直接呼び出すと、関数を動的に作成できます。

文法構造は次のとおりです。

var functionName = 新しい関数 ([arg1[, arg2[, ...argN]],] 関数本体)


functionNameは関数名、[arg1[, arg2[, ...argN]],]はオプションのパラメータリスト、functionBodyは関数を表します。

サンプルコードは次のとおりです。

// パラメータのない関数 var fun = new Function('console.log("This is a function")')
fun() // これは関数です // 1 つのパラメータを持つ関数 var fun = new Function('a', 'console.log("この関数は 1 つのパラメータを取ります: " + a)')
fun(100) // この関数は1つのパラメータを取ります: 100
// 2つのパラメータを持つ関数 var fun = new Function(
  「a, b」、
  'console.log("これは 2 つのパラメータ " + a + " と " + b" を持つ関数です);',
)
fun(100, 200) // これは100と200の2つのパラメータを持つ関数です

実際の開発では、まったく読みにくいため、この方法で関数を作成することは通常ありません。

1.2 機能と目的

  • Object型とFunctionはJavaScriptの参照型の1つです。
  • コンストラクタも関数の一種である
  • 関数は実際にはFunction型のオブジェクトである
  • JavaScript のすべてのオブジェクトは Object 型です。

認証コードは次のとおりです。

console.log(関数インスタンスの関数) //true
console.log(関数インスタンスオブオブジェクト) //true
console.log(Object インスタンス of Object) //true
console.log(オブジェクトインスタンス関数) //true

2. コンストラクター

2.1 カスタムのその他の関数

コンストラクター (コンストラクターまたはオブジェクト テンプレートとも呼ばれます) は、オブジェクトがインスタンス化されるときに呼び出されるオブジェクト内のメソッドです。 JavaScriptでは、関数をコンストラクターとして使用できるため、コンストラクター メソッドを明示的に定義する必要はありません。

コンストラクターを作成するための構文は次のとおりです。

関数Person(){
  this.property名 = プロパティ値;
  this.メソッド名 = 関数() {
      メソッド本体}
var person = 新しい Person();


ここで、 Personコンストラクターの名前です。Person をインスタンス化するには、new キーワードを使用する必要があります。また、コンストラクターの最初の文字は通常大文字になる点にも注意してください。

次のコードは、コンストラクターを作成する方法と、コンストラクターを通じてクラスをインスタンス化する方法を示しています。

// カスタムコンストラクター -> 関数: オブジェクトを作成する function Person(name, age, sex) {
  this.name = 名前
  this.age = 年齢
  this.sex = セックス
  this.print = 関数(){
    console.log(名前 + '今年' + 年齢 + '年齢と性別' + 性別)
  }
}
// お菓子のボウルを作成する var t = new Person('a bowl of sweets', 18, 'female')
hong.print() // Yiwantian は 18 歳で女性です // Yiwanzhou を作成します var z = new Person('Yiwanzhou', 20, 'male')
dong.print() //お粥一杯、20歳、男性

2.2 オブジェクトのコンストラクタプロパティ

Objectオブジェクトによって提供されるconstructorプロパティは、インスタンス オブジェクトObjectを作成するコンストラクターへの参照を返します。

すべてのオブジェクトはプロトタイプからコンストラクター プロパティを継承します。

このプロパティの値は関数名を含む文字列ではなく、関数自体への参照であることに注意することが重要です。

サンプルコードは次のとおりです。

// Yiwan Zhou を作成 var z = new Person('Yiwan Zhou', 18, '男性')
// Person コンストラクタのオブジェクトかどうかを確認します console.log(z.constructor === Person)

2.3 コンストラクタと関数

まずはコードを見てみましょう

関数Hero() {
  // 関数として使用 var v = 100 // ローカル変数 // コンストラクターとして使用 this.set = function (value) {
    v = 値
  }
  this.get = 関数 () {
    リターンv
  }
}


このコードでは、まず関数を定義します。この関数はコンストラクターでもあり、もちろんオブジェクトでもあります。

3つの意味があるので、以下のように3つの操作があります。

  • 関数として直接呼び出す
  • コンストラクタによるオブジェクトの作成
  • オブジェクトとして扱い、プロパティやメソッドを追加します

サンプルコードは次のとおりです。

// Hero() を直接呼び出す
// コンストラクターを通じてオブジェクトを作成する var hero = new Hero()
// オブジェクトとして扱い、プロパティとメソッドを追加します。Hero.n = 'A bowl of Zhou'
console.log(Hero.n) // 一杯の周

3. Functionオブジェクトのプロパティとメソッド

グローバルFunctionオブジェクトには独自のプロパティとメソッドはありませんが、関数でもあるため、プロトタイプ チェーンを通じて独自のプロトタイプ チェーン Function.prototype からいくつかのプロパティとメソッドも継承します。

3.1長さ属性

長さ属性は、関数の仮パラメータの数を示します。サンプル コードは次のとおりです。

// 2つの空の関数を定義します。 function fun(a, b, c, d) {}

関数 fn() {}

// 長さプロパティをテストする console.log(fun.length) // 4
console.log(fn.length) // 0

apply() メソッド:

apply() メソッドは、指定された this 値と、配列 (または配列のようなオブジェクト) として提供される引数を使用して関数を呼び出します。

構文の形式は次のとおりです。

func.apply(thisArg、[argsArray]) を適用します。


パラメータの説明は次のとおりです。

  • thisArg : 必須。 func 関数の実行時に使用する this 値。これはメソッドによって表示される実際の値ではない可能性があることに注意してください。関数が非厳密モードの場合、null または undefined の割り当ては、プリミティブ値がラップされたグローバル オブジェクトへの参照に自動的に置き換えられます。
  • argsArray : オプション。配列または配列のようなオブジェクト。その配列要素は、func 関数に個別のパラメータとして渡されます。このパラメータの値が null または未定義の場合、パラメータは不要であることを意味します。配列のようなオブジェクトは ECMAScript 5 以降で利用できます。

戻り値は、指定された this 値と引数を使用して関数を呼び出した結果です。

次のコードは、apply() メソッドの使用方法を示しています。

// 関数を定義する function fn(a) {
  console.log('これは ' + a です)
}
fn.apply(null, ['function']) // これは関数です // 上記の呼び出しは次のメソッドと同等です fn('function') // これは関数です

3.2call() メソッド

このメソッドの構文と機能はapply()メソッドと似ていますが、1 つの違いがあります。call() メソッドはパラメータ リストを受け入れるのに対し、 apply()メソッドは複数のパラメータを含む配列を受け入れます。

次のコードは call() メソッドの使用方法を示しています。

関数fn(a) {
  console.log('これは ' + a です)
}
fn.call(null, 'function') // これは関数です // 上記の呼び出しは次のメソッドと同等です fn('function') // これは関数です

bind() メソッド:
ind() メソッドは新しい関数を作成します。bind() が呼び出されると、新しい関数の this が bind() の最初のパラメータとして指定され、残りのパラメータは呼び出し時に使用する新しい関数のパラメータとして使用されます。

パラメータの説明は次のとおりです。

関数.bind(thisArg[, arg1[, arg2[, ...]]])

パラメータ:

thisArg : バインドされた関数が呼び出されたときに、 this 引数としてターゲット関数に渡される値。

arg1arg2 、...: ターゲット関数が呼び出されたときに、バインドされた関数の引数リストの先頭に追加される引数。

戻り値は、指定された **this** 値と初期パラメータを持つ元の関数のコピーです。

次のコードは bind() メソッドを示しています。

// 関数を定義する var fun = function (a, b) {
  console.log('最初のパラメータの値は:' + a + '2番目のパラメータの値は:' + b)
}
// fun() を呼び出す
fun(10, 20) // 最初のパラメータの値は: 10 2 番目のパラメータの値は: 20
// バインドされた関数を作成する var fn = fun.bind(null, 100, 200) // デフォルトのパラメータ値を持つ関数 // 実際のパラメータを記述せずに新しく作成された関数を呼び出す fn() // 最初のパラメータの値は: 100 2 番目のパラメータの値は: 200

4. 引数オブジェクト

argumentsオブジェクトは、すべての (矢印以外の) 関数で使用できるローカル変数です。引数オブジェクトを使用して、関数内から関数の引数を参照できます。このオブジェクトには、関数に渡される各引数が含まれており、最初の引数はインデックス 0 になります。たとえば、関数に 3 つのパラメータが渡される場合、次のように参照できます。

議論[0]
議論[1]
議論[2]

パラメータも再定義できます。オブジェクトには次の 2 つのプロパティもあります。

  • arguments.length : 関数に渡された引数の数を返します
  • arguments.callee : 引数が属する現在実行中の関数へのポインターを返します。このプロパティの後に () が続く場合、arguments.callee === fun が true と評価されるため、この関数を呼び出すことを意味します。

次のコードは、このオブジェクトの使用方法を示しています。コードは次のとおりです。

/*
 * 引数オブジェクトは、関数本体内に存在する特別なオブジェクトです。
 * 引数オブジェクトは配列のようなオブジェクトです * 引数オブジェクトは関数に渡される実際のパラメータに対応します */
// 関数を定義する var fun = function () {
  console.log(引数)
  // arguments.callee は、引数が属する現在実行中の関数を指します。
  //このプロパティに括弧を追加すると、呼び出しを意味します。 arguments.callee === fun はtrueと評価されるので
  console.log(引数.呼び出し先)
  // arguments.length 関数に渡される引数の数。
  console.log(引数の長さ)
}
楽しい(1, 2, 3, 4, 5) 


コード実行結果は次のとおりです。

[引数] { '0': 1、 '1': 2、 '2': 3、 '3': 4、 '4': 5 }
[機能:楽しい]
5


関数のオーバーロードを完了するために渡されるパラメータの数を決定するには、arguments.length プロパティを使用します。サンプル コードは次のとおりです。

// シミュレーション関数のオーバーロード function add() {
  // パラメータの数を記録する var len = arguments.length
  // オーバーロードされた関数をシミュレートするために渡されるパラメータの数を決定するには、switch case ステートメントを使用します switch (len) {
    ケース2:
      引数[0] + 引数[1]を返す
      壊す
    ケース3:
      引数[0] + 引数[1] + 引数[2]を返す
      壊す
    ケース4:
      引数[0] + 引数[1] + 引数[2] + 引数[3]を返す
      壊す

    デフォルト:
      壊す
  }
}
コンソール.log(add(1, 2)) // 3
コンソール.log(add(1, 2, 3)) // 6
コンソール.log(add(1, 2, 3, 4)) // 10

5. まとめ

この記事では、コンストラクターを作成する方法、コンストラクターを介してオブジェクトをインスタンス化する方法、および Function オブジェクトが提供するメソッドとプロパティについて説明します。使い方と最後に Arguments オブジェクトを紹介します。

JS 関数とコンストラクタに関するこの記事はこれで終わりです。より関連性の高い JS 関数とコンストラクタのコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Js クラスの構築と継承のケースの詳細な説明
  • JavaScript クラス継承の複数の実装方法
  • js クラスの継承定義と使用法の分析
  • JS 継承の分類、原則、使用法について深く理解するには 15 分かかります。
  • JavaScript のコンストラクター、プロトタイプ、プロトタイプ チェーン、new についてどれくらい知っていますか?
  • JavaScript の知識: コンストラクタも関数である
  • JavaScript のクラス、継承、コンストラクタの詳細な説明

<<:  HTML リスト タグ dl、ul、ol の使用例

>>:  MySQLにおける遅いSQLの最適化の方向性について詳しく話しましょう

推薦する

Prometheus を使用して、MySQL の自動増分主キーの残りの使用可能パーセンテージをカウントします。

最近、本番環境のデータベースがログデータを狂ったように書き込み、主キー値のオーバーフローを引き起こし...

Vue コンポーネント ライブラリ ElementUI はテーブル読み込みツリー データのチュートリアルを実装します

ElementUIは、参考のためにテーブルツリーリストの読み込みチュートリアルを実装しています。具体...

HTML テーブルタグチュートリアル (13): 内部境界スタイル属性ルール

RULES を使用すると、テーブルの内部境界のスタイルを制御できます。基本的な構文<TABLE...

MySQLでANDとORを組み合わせる問題を解決する

以下のように表示されます。 SELECT prod_name,prod_price FROM pro...

Linuxでのcrontabの使い方と注意点の詳しい説明

Crontab は定期的な実行を設定するために使用されるコマンドです。そのデーモン プロセスは cr...

JavaScriptはeコマースプラットフォームの製品詳細を実装します

この記事では、電子商取引プラットフォームで商品の詳細を表示する一般的な例を紹介します。たとえば、ある...

HTML要素によるFlashブロックの詳細な例

コードをコピーコードは次のとおりです。 wmode パラメータ:透過モード: z-indexを使用し...

vuex での mapState の考え方の応用

目次1. マップ方式2. 応用背景:需要開発プロセス中に、一部のインターフェースは、ページに表示する...

SSM VUE Axios の詳細な説明

目次SQL ログを表示するにはどうすればいいですか? ? SpringMVC でのパラメータ渡しの説...

HTMLタグオーバーフロー処理アプリケーション

CSSを使用してスクロールバーを変更する1.コンテンツがオーバーフローした場合のオーバーフロー設定水...

Webフロントエンド開発コース Webフロントエンド開発ツールとは

インターネット技術の発展に伴い、ユーザーはますます Web ページに依存するようになり、Web フロ...

Vue の状態管理: Vuex の代わりに Pinia を使用する

目次1. ピニアとは何ですか? 2. Piniaは使いやすい3. ユーザーエクスペリエンス1. ピニ...

WeChat アプレット ピッカー マルチ列セレクター (モード = multiSelector)

目次1. 効果図(複数列) 2. 通常セレクター: mode = selector、複数列セレクター...

Linuxサーバ侵入緊急対応記録(概要)

最近、お客様から支援の依頼を受けました。管理されている通信コンピュータ ルームから、サーバーの 1 ...