为什么要使用javascript调用方法?

为什么要使用javascript调用方法?,javascript,apply,call,Javascript,Apply,Call,我试图理解javascript中的调用和应用方法。但我不明白我为什么要用它 var person = { fullName: function() { return this.firstName + " " + this.lastName; } } var person1 = { firstName:"John", lastName: "Doe" } var person2 = { firstName:"Mary", lastName: "Doe" } var x

我试图理解javascript中的调用应用方法。但我不明白我为什么要用它

var person = {
   fullName: function() {
      return this.firstName + " " + this.lastName;
 }
}

var person1 = {
 firstName:"John",
 lastName: "Doe"
}
var person2 = {
 firstName:"Mary",
 lastName: "Doe"
}
var x = person.fullName.call(person1);  
我可以在不使用call和apply的情况下完成这个示例

var person = {
   fullName: function(firstName, lastName) {
     return firstName + " " + lastName;
 }
}
var person1 = {
  firstName:"John",
  lastName: "Doe"
}
var person2 = {
  firstName:"Mary",
  lastName: "Doe"
}
var x = person.fullName(person1.firstName, person1.lastName); 
或者我不明白这个例子

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

function Pizza(name) {
   Product.call(this,name);
}

const pizza = new Pizza("Margherita");

当我想到这个例子时,我可以使用原型。为什么使用call或apply?谢谢你

据我所知,你使用哪一种都取决于你的喜好,但你必须使用call和/或apply,没有它们你就做不到

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

function Pizza(name) {
   Product.call(this,name);
}

const pizza = new Pizza("Margherita");
那太好了。比萨饼是一种产品。在其他语言中,例如PHP,继承如下所示:

class Foo {

  public function __construct() {
    // Do stuff specific for Foo
  }

}

class Bar extends Foo {

  public function __construct()(
    parent::__construct();
    // Do stuff specific for Bar
  }

}
这里,我们没有
扩展
,为了让它工作,您需要说父构造函数中的
this
是子构造函数

使用
call
,您可以说出
Product()
函数/构造函数中的
this
是什么。 在本例中,它是Pizza对象(新创建的对象{})。如果不使用
call
Pizza
甚至连名字都没有

你的第一个例子也是如此

var person = {
   fullName: function() {
      return this.firstName + " " + this.lastName;
 }
}

var person1 = {
 firstName:"John",
 lastName: "Doe"
}
var person2 = {
 firstName:"Mary",
 lastName: "Doe"
}
var x = person.fullName.call(person1);  
是的,它在没有调用
call
的情况下工作,但没有剧烈的变化

person.fullName.call(person1)
就像是说,使用这个函数并用我的person1对象置换
这个
。所以最后,就好像你做了这件事:

return person1.firstName + " " + person1.lastName;
至于使用

注意:虽然此函数的语法与call()的语法几乎相同,但基本区别在于call()接受参数列表,而apply()接受单个参数数组


一个好的用例是当您想“借用”一个具有不同上下文的函数时。以下面的示例为例,您完全可以使用继承为Cat提供
bark
函数,但您可能不希望该函数存在于每个实例上,而只希望在某些情况下使用它

function Dog(name) {
    this.name = name
    this.bark = function() {
        console.log('woof' + this.name)
    }
}
const dog = new Dog('spot')

dog.bark() // woofspot


function Cat(name) {
    this.name = name
}
const cat = new Cat('cat')

dog.bark.call(cat) // woofcat


@Rup是正确的,好的,我修正了它。你现在能检查一下吗?好的,我完全改变了样品。我想知道的是我应该在哪里使用它@RupYou使用
.call
,因此方法的
上下文在其原始上下文之外的另一个上下文中调用。顺便说一句,如果你只想要一个
新产品
,那么在上一个例子中使用原型也是一种浪费。我不明白为什么我不能。但是如果你说这是一个选择的问题,我明白了。如果你把两者都删除,你应该得到@Rup在评论下发布的内容。看看这篇文章,好吧,我完全改变了示例。我想知道的是我应该在哪里使用它@死亡Waltz@omerstack看看另一个答案,它比我解释的更好,我不能对继承做同样的解释吗@jperl@omerstack什么意思?那已经是遗产了。比萨饼继承了这个产品。在比萨饼中,我们称之为产品,但使用比萨饼的上下文(此)。所以这个.name就像说(披萨)。name=name;然后你可以在调用Product之后为Pizza添加属性。我的意思是,我可以使用Object.create和prototype来完成吗?因为正如我所读到的,我们使用原型进行继承。请看这个。它还解释了如何继承产品原型堆栈上的方法。原型用于对象实例共享的函数。但是您需要执行
调用
来继承构造函数中的属性。