Javascript调用并应用于构造函数

时间:2013-01-09 11:46:23

标签: javascript inheritance constructor call apply

我理解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

根据我的理解,上面发生的是他用Alice的范围调用Bob对象的greet方法。

有人可以解释下面示例中幕后发生的事情,其中​​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"}

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

2 个答案:

答案 0 :(得分:1)

这是一种“借用”Product的构造函数来初始化新Food的方法。

当您使用new调用某个功能时,您将this设置为新实例。您正在执行Product.call(即调用Product函数并将this函数中的Product设置为您的新Food实例(this 1}}在Food))内,并传递nameprice

Product.call(this, name, price);之后,您会发现已设置this.namethis.price

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

要获得继承,您还必须将prototype 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/


N.B:请注意“使用Alice的 范围 调用Bob”;这不是真的。 Bob没有继承Alice的范围,this函数中greet的值仅被改为Alice。继承范围意味着Bob可以访问私有变量等,但他没有。

答案 1 :(得分: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是构造函数,您在其中定义属性name和surname。 prototype函数使用method函数进行扩展,我使用this键。它指的是从外部定义的指定对象。

使用var obj = new Human("Name","Surname");初始化Human类并传递值(name,surname)。在这种情况下,您有一个名为obj的对象,但您可以定义任意数量的对象