我理解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方法用于正在初始化某些属性的构造函数。
答案 0 :(得分:1)
这是一种“借用”Product
的构造函数来初始化新Food
的方法。
当您使用new
调用某个功能时,您将this
设置为新实例。您正在执行Product.call
(即调用Product
函数并将this
函数中的Product
设置为您的新Food
实例(this
1}}在Food
))内,并传递name
和price
。
在Product.call(this, name, price);
之后,您会发现已设置this.name
和this.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("$");
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
的对象,但您可以定义任意数量的对象