Почему я должен использовать метод вызова javascript? - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь понять методы 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 = 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");

Когда я думаю об этом примере, я могу сделать с прототипом. Зачем использовать звонок или подать заявку? Спасибо

Ответы [ 3 ]

1 голос
/ 17 октября 2019

Хороший вариант использования - это когда вы хотите «позаимствовать» функцию с другим контекстом. Возьмите приведенный ниже пример, вы определенно можете использовать наследование, чтобы дать 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

0 голосов
/ 17 октября 2019
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
  }

}

Здесь у нас нет extends, и чтобы заставить его работать, нужно сказать, что this вродительский конструктор является дочерним.

Используя call, вы можете сказать, что такое this в функции / конструкторе Product(). В данном случае это объект 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); - все равно что сказать: возьми эту функцию и переставь this с моим объектом person1. Итак, в конце концов, вы как будто сделали это:

return person1.firstName + " " + person1.lastName;

Что касается , какой использовать

Примечание. Хотя синтаксис этогофункция почти идентична функции call (), принципиальное отличие состоит в том, что call () принимает список аргументов , а apply () принимает единственный массив аргументов .

0 голосов
/ 17 октября 2019

Насколько мне известно, все зависит от ваших предпочтений, но вы должны использовать колл и / или подать заявку, вы не можете сделать это без них.

...