2

我了解调用(和应用)方法在以下示例中的工作原理。

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

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

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

据我了解,上面发生的事情是他在 Alice 的范围内调用了 Bob 对象的 greet 方法。

有人可以在下面的示例中解释幕后发生的事情,其中​​调用方法用于允许继承的构造函数吗?

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"}

我无法在第一个示例和第二个示例之间建立联系,其中第一个示例调用方法是在一个正在执行某些操作(警报)的函数上调用的,而在第二个示例中,调用方法用于构造函数正在初始化一些属性。

4

2 回答 2

1

这是一种“借用”构造函数的方式Product来初始化你的 new Food

当您使用 调用函数时new,您将设置this为新实例。然后你正在做Product.call(即调用Product函数并将函数this内部设置Product为你的新Food实例(在this内部Food)),并传递你的nameand price

之后Product.call(this, name, price);你应该找到那个this.name并且this.price已经设置好了。

这不允许继承,也不会获得继承;Product它只是在你的新Food实例上执行构造函数。

要获得继承,您还必须将prototypeof设置Food为新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。继承范围意味着 Bob 可以访问私有变量等,而他没有。

于 2013-01-09T11:49:24.907 回答
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类并在那里传递值(姓名,姓氏)。在这种情况下,您有一个名为 的对象obj,但您可以定义任意数量的对象

于 2013-01-09T11:52:59.990 回答