2

私はこのようなjsオブジェクトを持っています:

var Dog = function(dogName) {
  this.bark = function() {
    console.log(dogName + " is barking");
  }
}

var Dog = function(dogName) {
  this.dogName = dogName;
  this.bark = function() {
    console.log(this.dogName + " is barking");
  }
}

私は両方を同じように使うことができます:

var puppy = new Dog("Ringo");
puppy.bark();

私の質問は、これら2つのアプローチの間に実際的な違いはありますか?コンストラクターパラメーターをに割り当てる方が良いですthis.<field>か、それとも、内部関数にアクセスできるので、それらのパラメーターをすぐに利用できますか?両方に特別なケースはありますか?

4

3 に答える 3

4

大きな違いは、パラメーターdogNameがインラインで宣言したものに機能的にスコープされていることです。これは機能的にプライベートです。また、インスタンス(puppyなど)を介して値を変更しても、関数の出力は変更されません。

たとえば、私がそうする場合:

Dog.prototype.bark2 = function() { console.log(dogName); }

範囲外であるため、これは失敗します。しかし、に追加すると、thisアクセスできるようになりますconsole.log(this.dogName)。繰り返しになりますが、それは実際にはスコープとそれをどのように使用するかについてです。

于 2012-12-06T21:19:52.253 に答える
2

違いはあなたが言うときに何が起こるかです

var puppy = new Dog("Ringo");
puppy.dogName = "George";
puppy.bark();

最初のアプローチでは、引き続き「Ringo」という名前が使用され、2番目のアプローチでは「George」と表示されます。同じ理由であなたが言おうとすると

var puppy = new Dog("Ringo");
console.log("created new puppy: " + puppy.dogName);

これは2番目のバージョンでは機能しますが、最初のバージョンでは機能しません。したがって、dogName初期化後にアクセスまたは変更できないように効果的にプライベートにすることが目標である場合は、最初のアプローチを使用する必要があります。それ以外の場合は、常に2番目のアプローチを使用してください。

于 2012-12-06T21:20:15.297 に答える
0

最初のバージョンでは、dogNameはプライベートです。オブジェクトを調べてその変数の値を見つける方法はありません。を呼び出すことで推測できbarkますが、直接見ることはできません。その式の中で宣言されたコードだけfunctionがそれを見ることができます。

2番目のバージョンでdogNameは、はとして公開されobject.dogNameます。

于 2012-12-06T21:20:22.923 に答える