2

コードはmozillaのWebサイトからのものです

function Product(name, price) {
  this.name = name;
  this.price = price;

  if (price < 0)
    throw RangeError('Cannot create product "' + name + '" with a negative price');
  return this;
}

function Food(name, price) {
   Product.call(this, name, price);/// why not this be Product(name,price)
   this.category = 'food';
}
Food.prototype = new Product();

非常にばかげているかもしれません、この行を理解することはできません
Product.call(this, name, price);

ProductとFoodはどちらもグローバル関数であるため、Product.callを使用する必要があるのはなぜですか。

4

6 に答える 6

3

Product関数はコンストラクターであり、これは通常、で呼び出されますnew。関数を呼び出すときに使用newすると、新しい空のオブジェクトが作成され、新しいオブジェクトをコンテキストとして関数を呼び出すと、プロトタイプチェーンも設定されます。

この例FoodはサブクラスProduct化であり、の新しいインスタンスでProductコンストラクターを実行する必要がありますFood

例は物事を明確にする必要があります:

var f = new Food ('apple', 10)

f.name = 'apple'
f.price = 10
f.category = 'food'

名前と価格のカテゴリはProduct、の新しいインスタンスでコンストラクターを呼び出すことによってオブジェクトに追加されていますFood

于 2013-01-25T15:09:53.693 に答える
2

Product食品オブジェクトに関数を適用したいからです。せずに呼び出すだけでcallは、間違ったthisになり、追加されたプロパティProductは間違ったオブジェクトにアタッチされます。

継承についてもここで学びます。

于 2013-01-25T15:04:58.560 に答える
2
Product.call(this, name, price);

この行はthis、呼び出しオブジェクトとして製品関数を呼び出し、引数として名前と価格を呼び出します

これにより、明示的に割り当てることなく、製品を食品の方法として扱うことができます。これを行わないと、製品内で「this」を呼び出すと、グローバルオブジェクトがポイントされます。代わりに、作成中のFoodのインスタンスに割り当てられます。

この場合、これを行うための考えられる目的は、Productを使用して、ProductをFoodオブジェクト定義の永続的な部分にすることなく、コンストラクターでオブジェクトを準備することです(これは、Foodのメソッドとして割り当てた場合に発生しますが、他の人が再利用できる(コンストラクター関数のロジックまたはコンストラクター内の内部関数の一部にした場合は不可能です)

于 2013-01-25T15:06:10.007 に答える
1

この場合

Product.call(this, name, price);

これ->はFoodインスタンスであり、ウィンドウではありません

于 2013-01-25T15:05:38.930 に答える
1

JavaScriptで関数を呼び出す方法は複数あります。

その1つはcall、関数オブジェクトのメソッドを呼び出すことです。コンテキスト(関数内の意味this)と関数の引数を他の引数として受け入れます。

例:

var context = { foo: 'bar' };
function func(a, b, c) {
   console.log(this.foo);
   console.log(a, b, c);
}
func.call(context, 1, 2, 3);
//'bar'
//1 2 3

に似た方法がもう1つありcallますapply。関数のパラメーターを持つコンテキストと配列の2つの引数を受け入れます。

于 2013-01-25T15:05:53.363 に答える
1

call関数はすべてのオブジェクトのメソッドですFunction。これにより、特定のコンテキストを関数に渡すことができ、基本的にthis関数内のキーワードを設定できます。

call()のMDNドキュメント

于 2013-01-25T15:05:54.320 に答える