JavaScriptの中の普通の関数と構造関数の比較

4393 ワード

問題
コンストラクタとは何ですか?構造関数と普通関数の違いは何ですか?newキーワードを使う時はいったい何をしましたか?コンストラクタの戻り値がありますが、どうすればいいですか?コンストラクタは普通の関数で呼び出すことができますか?
以下は私の理解です.間違ったところをご理解ください.ご指摘をお願いします.ありがとうございます.
this thisは、現在実行されている関数または方法のownerを永遠に指す.たとえば:

function test(){
  console.log(this);
}
test();
//Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
上記のコードでは、ページでtest関数を定義し、ページで呼び出します.関数の定義はグローバルの時に、そのownerは現在のページ、つまりwindowオブジェクトです.
thisが指すいくつかの場合
1.グローバルでの呼び出し
    this.name/thisはwindowオブジェクトを指します.    2.関数コール
    test()///test()関数の中のthisもwindowオブジェクトを指します.    3.オブジェクトの呼び出し方法
    obj 1.fn()//obj 1オブジェクトのfn()方法の中のthisはobj 1を指します.    4.コンストラクタの呼び出し    var dog=new Docg()//コンストラクタ内のthisは、新しく作成されたインスタンスオブジェクト、つまりここのdogcalとappyを指します.
callとappyの役割は同じですが、パラメータの受け取り方が違っています.callは複数の単一パラメータを受け取ります.appyはパラメータ配列を受け入れます.callおよびapplyの役割は、オブジェクトのインスタンスに関数/方法が欠けている場合、他のオブジェクトの既製関数/方法を呼び出すことができ、このオブジェクトのインスタンスを置き換えることによって、関数の実行時のコンテキストを変更することができる.たとえば:

function Dog(){
  this.sound="   ";
}
Dog.prototype.bark=function(){
  alert(this.sound);
}
もう一つのcat対象があります.
var cat={sound:'ニャース}
私もこのcatオブジェクトにbarkメソッドを呼び出すことができるようにしたいです.この時はbarkメソッドを再定義しなくてもいいです.call/appyでDocgタイプのbarkメソッドを呼び出すことができます.
Docg.prototype.bark.cat;
または:
dog.bark.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.newキーワードでの呼び出しは不要です.
    fn()2.return文で値を返してもいいです.

 function fn(a,b){
    return a+b;
  }
  alert(fn(2,3));//alert:5
3.関数の内部では、thisのキーワードを使用することを推奨していません.もちろん、あえて使うのはいいです.この時に何が起こったかに注意してください.普通の関数の内部でthisキーワードを使って変数や関数を定義すると、この時点でthisはWindows全体のオブジェクトを指していますので、windowにグローバル変数や関数をいくつか追加します.

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.デフォルトではリセットなしで値のコンストラクタを返す必要はないですが、デフォルトではthis、つまり新しいインスタンスオブジェクトを返します.もちろん、return文を使ってもいいです.戻り値は、return値の種類によって異なります.詳細は以下に紹介します.
4.関数の名前は、一般の関数とは別に、最初の文字を大文字にすることを提案します.ネーミング仕様ではないですが、このように書くことを勧めます.
newキーワードを使って実用化した時に何が発生しましたか?以上の文のPrince()関数は栗を挙げます.
1.最初のステップで空のオブジェクトを作成します.
var prince={}
2.第二ステップは、構築関数Prince()のthisを新規作成の対象princeに向ける.3.第三歩、princeの_をプロト属性はPrince関数のprototypeを指し、オブジェクトとプロトタイプの間の関係を作成します.4番目のステップは、構造関数Prince()内のコードを実行します.
コンストラクターの価値がありますが、どうすればいいですか?コンストラクタに表示されていない場合は、デフォルトではthisオブジェクト、すなわち新規作成されたオブジェクトを返します.コンストラクタからreturnを呼び出すと、二つの状況に分けられます.
1.returnは5種類の簡単なデータタイプです.String、Number、Boolean、Null、Udefined.この場合、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"}