ホームページ ウェブフロントエンド jsチュートリアル JavaScriptにおける通常の関数とコンストラクタの比較_javascriptスキル

JavaScriptにおける通常の関数とコンストラクタの比較_javascriptスキル

May 16, 2016 pm 04:05 PM
通常の関数 コンストラクタ

質問

コンストラクターとは何ですか?
コンストラクターと通常の関数の違いは何ですか?
新しいキーワードを使用したとき、具体的には何をしましたか?
コンストラクターに戻り値がある場合はどうすればよいですか?
コンストラクターは通常の関数として呼び出すことができますか?

以下は私の理解の一部です。誤解がある場合は修正してください。ありがとうございます。

これ
これは常に、現在実行されている関数またはメソッドの所有者を指します。例:

function test(){
  console.log(this);
}
test();
//Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
ログイン後にコピー

上記のコードでは、ページ内で test() 関数を定義し、ページ内でそれを呼び出します。関数がグローバルに定義されている場合、その所有者は現在のページ (ウィンドウ オブジェクト) になります。

これが示すいくつかの状況

1. グローバルに電話をかける

this.name //this はウィンドウ オブジェクトを指します

2. 関数呼び出し

test();//test() 関数内のこれもウィンドウ オブジェクトを指します

3. オブジェクトメソッド呼び出し

obj1.fn();//obj1 オブジェクトの fn() メソッド内のこれは obj1
を指します
4. コンストラクター
を呼び出します var Dog=new Dog();//コンストラクター内の this は、新しく作成されたインスタンス オブジェクトを指します。これは、dogcall であり、ここでは apply

です

call と apply の機能は同じですが、call は複数の単一パラメータを受け入れますが、apply はパラメータの配列を受け入れます。
call と apply の役割は、簡単に言うと、オブジェクト インスタンスに関数/メソッドがない場合、これをこのオブジェクト インスタンスに置き換えて関数の実行時コンテキストを変更することで、他のオブジェクトの既製の関数/メソッドを呼び出すことができます。
例:

function Dog(){
  this.sound="汪汪汪";
}
Dog.prototype.bark=function(){
  alert(this.sound);
}
ログイン後にコピー

これで、別の猫オブジェクトができました:

var cat={sound:'ニャーニャー'}

この cat オブジェクトが bark メソッドを呼び出せるようにしたいのですが、現時点では、call/apply を使用して Dog クラスの bark メソッドを呼び出すことができます。

Dog.prototype.bark.call(cat);

または:

dog.bark.call(cat);

パラメーターを使用して栗に変える何かを追加します:

function Dog(){
  this.sound="汪汪汪";
}
Dog.prototype.bark=function(words){
  alert(this.sound+" "+words);
}
var dog=new Dog();
dog.bark("有小偷");//alert:汪汪汪  有小偷
Dog.prototype.bark.call(cat,"饿了");//alert:喵喵喵  饿了
ログイン後にコピー

共通機能
これは単純な通常の関数です:

function fn(){
  alert("hello sheila");
}
fn();//alert:hello sheila
ログイン後にコピー

通常の関数には、コンストラクターと比較して 4 つの明らかな特徴があります。

1.

を呼び出すために新しいキーワードを使用する必要はありません。

fn();2. return ステートメントを使用して値

を返すことができます。
 function fn(a,b){
    return a+b;
  }
  alert(fn(2,3));//alert:5
ログイン後にコピー

3. 関数内で this キーワードを使用することはお勧めしません
使用は推奨されていませんが、必要に応じて使用することももちろん可能です。現時点で何が起こるかに注意してください。通常の関数内で this キーワードを使用して変数または関数を定義すると、この時点ではウィンドウ グローバル オブジェクトを指しているため、一部のグローバル変数または関数が意図せずウィンドウに追加されます。

function greeting(){
    this.name="sheila";
    alert("hello "+this.name);
  }
  greeting();//alert:hello sheila
  alert(window.name);//alert:sheila
ログイン後にコピー

4. 関数名はキャメルケースで、最初の文字は小文字です

コンストラクター
JavaScript では、 new キーワードを使用して、定義されたコンストラクターを呼び出します。デフォルトで返されるのは、コンストラクターによって定義された変数と関数/メソッドを含む新しいオブジェクトです。

例を挙げてください:

function Prince(name,age){
  this.gender="male";
  this.kind=true;
  this.rich=true;
  this.name=name;
  this.age=age;
}
Prince.prototype.toFrog=function(){
  console.log("Prince "+this.name+" turned into a frog.");
}
var prince=new Prince("charming",25);
prince.toFrog();//Prince charming turned into a frog.
prince.kind;//true
ログイン後にコピー

与普通函数相比,构造函数有以下明显特点:

1.用new关键字调用

var prince=new Prince("charming",25);

2.函数内部可以使用this关键字
在构造函数内部,this指向的是构造出的新对象。用this定义的变量或函数/方法,就是实例变量或实例函数/方法。需要用实例才能访问到,不能用类型名访问。

prince.age;//25
Prince.age;//undefined

3.默认不用return返回值
构造函数是不需要用return显式返回值的,默认会返回this,也就是新的实例对象。当然,也可以用return语句,返回值会根据return值的类型而有所不同,细节将在下文介绍。

4.函数命名建议首字母大写,与普通函数区分开。
不是命名规范中的,但是建议这么写。

使用new关键字实例化的时候发生了什么?
以上文中的Prince()函数举个栗子:

1.第一步,创建一个空对象。

var prince={}

2.第二步,将构造函数Prince()中的this指向新创建的对象prince。
3.第三步,将prince的_proto_属性指向Prince函数的prototype,创建对象和原型间关系
4.第四步,执行构造函数Prince()内的代码。

构造函数有return值怎么办?
构造函数里没有显式调用return时,默认是返回this对象,也就是新创建的实例对象。
当构造函数里调用return时,分两种情况:

1.return的是五种简单数据类型:String,Number,Boolean,Null,Undefined。
这种情况下,忽视return值,依然返回this对象。

2.return的是Object
这种情况下,不再返回this对象,而是返回return语句的返回值。

function Person(name){
    this.name=name;
    return {name:"cherry"}
  }
  var person=new Person("sheila");
  person.name;//cherry
  p;//Object {name: "cherry"}
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

es6のアロー関数と通常の関数の違いは何ですか es6のアロー関数と通常の関数の違いは何ですか Mar 08, 2022 pm 12:11 PM

相違点: 1. アロー関数の定義は、通常の関数の定義よりもはるかに単純、明確、高速です; 2. アロー関数は独自の this を作成しませんが、通常の関数は作成します; 3. アロー関数は次のようにすることはできません。コンストラクタとして使用されますが、アロー関数はコンストラクタとして使用できません. 関数はコンストラクタとして使用できます; 4. アロー関数には独自の引数がありませんが、アロー関数には独自の引数があります。

Python のコンストラクター Python のコンストラクター Sep 02, 2023 pm 04:29 PM

Python では、すべてのクラスにコンストラクターがあります。コンストラクターは、クラス内で指定される特別なメソッドです。コンストラクター/イニシャライザーは、クラスの新しいオブジェクトが作成されるときに自動的に呼び出されます。オブジェクトが初期化されるとき、コンストラクターはクラス内のデータ メンバーに値を割り当てます。コンストラクターを明示的に定義する必要はありません。ただし、コンストラクターを作成するには、次の規則に従う必要があります。クラスの場合、コンストラクターは 1 つだけ持つことができます。コンストラクター名は __init__ である必要があります。コンストラクターは、インスタンス プロパティを使用して定義する必要があります (最初の引数として self キーワードを指定するだけです)。 None 以外の値を返すことはできません。構文 classA():def__init__(self):pass 例 次の例を考えてみましょう。

C++ 構文エラー: 同じコンストラクター シグネチャが複数回表示されます。解決方法は? C++ 構文エラー: 同じコンストラクター シグネチャが複数回表示されます。解決方法は? Aug 22, 2023 pm 04:49 PM

C++ は強力なプログラミング言語ですが、使用中にさまざまな問題が発生することは避けられません。その中で、同じコンストラクター シグネチャが複数回出現することは、一般的な構文エラーです。この記事では、このエラーの原因と解決策について説明します。 1. エラーの原因 C++では、オブジェクト作成時にオブジェクトのデータメンバを初期化するためにコンストラクタを使用します。ただし、同じコンストラクター シグネチャが同じクラスで定義されている場合 (つまり、パラメーターの型と順序が同じである場合)、コンパイラーはどのコンストラクターを呼び出すかを決定できず、コンパイル エラーが発生します。例えば、

C++ 構文エラー: クラスの外で定義されたコンストラクターは、クラス名を修飾子として追加する必要があります。どのように修正すればよいですか? C++ 構文エラー: クラスの外で定義されたコンストラクターは、クラス名を修飾子として追加する必要があります。どのように修正すればよいですか? Aug 22, 2023 pm 02:00 PM

C++ は広く使用されているオブジェクト指向プログラミング言語です。C++ でクラス コンストラクターを定義する場合、コンストラクターの定義をクラスの外に配置する場合は、コンストラクターの定義に修飾子としてクラス名を追加する必要があります。このコンストラクターがどのクラスに属するかを指定します。これは C++ 構文の基本的なルールです。クラスのコンストラクターを定義するときにこの規則に従わない場合、コンパイル エラーが表示され、「クラス外で定義されたコンストラクターはクラス名で修飾する必要があります。」というメッセージが表示されます。したがって、この種のコンパイル エラーが発生した場合は、次のことを行う必要があります。

Go 言語にはコンストラクターがありますか? Go 言語にはコンストラクターがありますか? Jan 10, 2023 pm 02:15 PM

Go 言語にはコンストラクターがありません。構造化言語としての Go 言語には、オブジェクト指向言語のコンストラクターがありませんが、オブジェクト指向言語のコンストラクターと同様の効果は、構造の初期化プロセスを使用して、オブジェクト指向言語をシミュレートする方法で実現できます。コンストラクターの実装。

コンストラクターとは何ですか? JavaScriptのコンストラクタの詳しい説明 コンストラクターとは何ですか? JavaScriptのコンストラクタの詳しい説明 Aug 04, 2022 pm 03:22 PM

プロトタイプとプロトタイプ チェーンの基礎として、まずコンストラクターとその実行プロセスを理解することは、プロトタイプとプロトタイプ チェーンの知識をよりよく学ぶのに役立ちます。この記事では、JavaScript のコンストラクターについて詳しく説明し、コンストラクターを使用して js オブジェクトを作成する方法を紹介します。

アロー関数と通常の関数の違い アロー関数と通常の関数の違い Sep 13, 2023 am 09:32 AM

アロー関数と通常の関数の主な違いは、構文の単純さ、この点の違い、コンストラクターには適用できないこと、引数オブジェクトがないことなどです。詳細な紹介: 1. 構文の単純さ. アロー関数の構文は通常の関数よりも簡潔です. アロー関数は矢印を使用して定義できます. 関数キーワードと中括弧は省略され、関数のパラメータと戻り値は省略されますアロー関数は、パラメータが 1 つだけの場合、括弧を省略することもできます; 2. これは異なるポイントを指します。

C++ エラー: コンストラクターはパブリック領域で宣言する必要があります。どのように対処すればよいですか? C++ エラー: コンストラクターはパブリック領域で宣言する必要があります。どのように対処すればよいですか? Aug 21, 2023 pm 08:26 PM

C++ プログラミングでは、コンストラクターはクラスのメンバー変数を初期化するために使用される重要な関数です。これは、オブジェクトの適切な初期化を保証するために、オブジェクトの作成時に自動的に呼び出されます。コンストラクターはクラス内で宣言する必要がありますが、「コンストラクターはパブリック領域で宣言する必要があります。」というエラー メッセージが表示される場合があります。このエラーは通常、コンストラクターのアクセス修飾子が間違っていることが原因で発生します。 C++ では、クラスのメンバー変数とメンバー関数には、public、private、protected などのアクセス修飾子があります。

See all articles