JavaScriptを理解する(三)

13212 ワード

JavaScriptの中のコンストラクタ
コンストラクタとは何ですか?
コンストラクタはコンストラクタとも言います.それは普通の関数です.  new オペレータが協力して特定の種類のオブジェクトを作成します.について  new オペレータ、私の理解JavaScript(一)にはさらに記述があります.
例:

  
  
  
  
var me = new Person('Albert', 'Yu', 32); // Person
本例では、me オブジェクトは特定のタイプを持っています.  Person オブジェクトに対する  Person そのタイプの名前です.
構造関数の内部はどうやって働きますか?

  
  
  
  
function Person(firstName, lastName, age) { this.firstName = firstName; this.lastName = lastName; this.age = age; };
普通の関数と比較して、二つの明確な違いがあります.以下のように説明します.
関数名の最初の文字は大文字です.これは強制行為ではなく約束です.ほとんどのJavaScriptプログラマはこの約束を守ります.すなわち最初の文字の大文字の関数名はコンストラクションです.もちろん、最初の文字小文字の関数は、構造関数として機能することができます.
使用  this ローカル変数をバンドルにします.一般的な関数はローカル変数を直接作成して値を保存します.  this ローカル変数をバンドルにするのは配合のためです.  newオペレータ.何故なら  new オペレータは新しいオブジェクトを作成し、新しいオブジェクトをコンストラクタの内部に結合します.  this に縛られています.  this 上のローカル変数は、実際には新しいオブジェクトの属性となります.
したがって、このような構造関数によって作成されたオブジェクトは、ほぼ同じである.

  
  
  
  
var me = { firstName: 'Albert', lastName: 'Yu', age: 32 };
それなら、なぜコンストラクションを書きますか?
コンストラクタの役割
1.オブジェクトを作成するためのテンプレート
少数のオブジェクト(例えば一つ)を作成するだけでは、構造関数を作成することはあまり意味がない.しかし、重複してオブジェクトを作成する必要がある場合、構造関数は明らかにDRY(Don't Repeat Youself)のベストな選択です.
重複符号化の作業量を減らすだけでなく、入力パラメータを検証したり、間違った機能を投げたりすることがよくあります.構造関数によっても完成できます.
2.オブジェクトの種類として使用するタグ
コンストラクタを使って作成したオブジェクトは、その種類を簡単にチェックできます.

  
  
  
  
var me = new Person('Albert', 'Yu', 32); var you = { firstName: 'Super', lastName: 'Man', age: 18 }; console.log(me instanceof Person); // true console.log(you instanceof Person); // false
3.オブジェクトの共有属性を作成する
これはコンストラクタを使用する最も重要な理由かもしれません.プロトタイプ継承に基づくJavaScriptは、メンバー属性をオブジェクトに拡張するのに便利です.

  
  
  
  
var me = new Person('Albert', 'Yu', 32); me.firstName; // "Albert" me.lastName; // "Yu" me.age; // 32 // Person …… Person.prototype.isAlive = true; me.isAlive; // true // …… me.firstName + ' ' + me.lastName; // "Albert Yu" // ? Person.prototype.fullName = function() { return [this.firstName, this.lastName].join(' '); }; me.fullName(); // "Albert Yu" // , ……
より良い構造関数
ちょっと注意してください.
立体関数を使ってオブジェクトを作成するには、必ず使用します.  new オペレータ
これは、本当に新しいオブジェクトを作成するのはコンストラクションではなく、コンストラクションであるからです.  new オペレータ.コンストラクタは新しいオブジェクトのテンプレートとして機能するだけで、受信します.  new 作成したオブジェクトをテンプレートで塗りつぶします.
このため、使用を忘れました.  new 危険です.ないから  new 新しいオブジェクトを作成するときは、構造関数内の  this 全体のオブジェクトに縛られます.通常は  window(ブラウザ)または  global(Node.js)です.何が起こるか見てみましょう.

  
  
  
  
var me = new Person('Albert', 'Yu', 32); me.firstName; // "Albert" var you = Person('Super', 'Man', 18); you.firstName; // undefined... WTF?! this.firstName; // "Super"...Shiiiit! // this
どうやって構造関数を改善しますか?簡単です

  
  
  
  
function Person(firstName, lastName, age) { if (this instanceof Person) { // ? this.firstName = firstName; this.lastName = lastName; this.age = age; } else { throw new Error(' `new` ~~~'); } }
この考え方は構造関数が受信したと判断します.  this 自分の実例ではないかというと、何でもいいです.もしそうでないなら、誤ってユーザーに強制的に使うようにします.  new オペレータ
もちろん、この改善は確かですが、「スマート」ではないので、構造関数を自分で判断して自動的に使うことができます.  new いいですねそうです.これはもっといい方法です.でもここでは披露しません.それともあなた自身で実践してみますか?(ヒント:構造関数の原型オブジェクトを考えてみます.思いつかないなら大丈夫です.後で話をします.)