2

次の例で call (および apply) メソッドがどのように機能するかを理解しています。

var Bob = {
  name: "Bob",
  greet: function() {
   alert("Hi, I'm " + this.name);
  }
}

var Alice = {
 name: "Alice",
};

Bob.greet.call(Alice);   // Hi, I'm Alice

私が理解していることから、上記で起こっていることは、アリスのスコープで呼び出されたボブオブジェクトのグリーティングメソッドです。

継承を許可するコンストラクター関数で call メソッドが使用されている以下の例で、舞台裏で何が起こっているのか誰かが説明できますか?

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

}

function Food(name, price) {
  Product.call(this, name, price);
  this.category = 'food';
}

var chicken = new Food('chicken','40');
console.log(chicken);  //{ name= "chicken", price="40", category="food"}

最初の例と 2 番目の例を関連付けることができません。最初の例では、call メソッドが何かを実行している関数 (アラート) で呼び出されますが、2 番目の例では、call メソッドがコンストラクター関数で使用されています。一部のプロパティを初期化しています。

4

2 に答える 2

1

簡単な例で説明しようと思います。

function Human(name,surname){
    this.name = name;
    this.surname = surname;
}

Human.prototype.method = function(){
    alert("Hi " + this.name + " " + this.surname);
};

var obj = new Human("Name","Surname");
obj.method();

この場合Humanは、プロパティの名前と名前を定義しているコンストラクターです。 関数は、私がキーを使用している関数でprototype拡張します。これは、外部から定義された指定されたオブジェクトを参照します。methodthis

var obj = new Human("Name","Surname");クラスを初期化し、Humanそこに値(name、surname)を渡します。この場合、という名前objのオブジェクトが1つありますが、好きなだけ定義できます

于 2013-01-09T11:52:59.990 に答える
1

Productこれは、 new を初期化するためにのコンストラクター関数を「借用」する方法ですFood

で関数を呼び出すと、新しいインスタンスにnew設定されます。this次に、実行しますProduct.call(つまり、関数を呼び出し、関数内で新しいインスタンス(内にあります)になるようにProduct設定します)、 and を渡します。thisProductFoodthisFoodnameprice

あなたがそれをProduct.call(this, name, price);見つけて設定した後。this.namethis.price

これは継承を許可せず、継承も得ません。Product新しいFoodインスタンスでコンストラクター関数を実行するだけです。

継承を取得するには、prototypeofFoodを新しいProductインスタンスに設定する必要もあります。

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

Product.prototype.showPriceIn = function (currency) {
    alert(this.price + currency);
} 

function Food(name, price) {
  Product.call(this, name, price);
  this.category = 'food';
}

Food.prototype = new Product;

var chicken = new Food('chicken','40');
chicken.showPriceIn("$");

http://jsfiddle.net/hPWMN/


注意:「Bob はAliceのスコープで呼び出される」ということに注意してください。これは真実ではありません。Bob は Alice のスコープを継承せず、関数this内のの値が にgreet変更されるだけAliceです。スコープを継承すると、ボブはプライベート変数などにアクセスできるようになりますが、ボブはそうではありません。

于 2013-01-09T11:49:24.907 に答える