В чем разница в заимствовании метода с использованием метода вызова и оператора "=" в JavaScript? - PullRequest
3 голосов
/ 03 апреля 2020

Рассмотрим следующие объекты

var person1 = {
   name: 'Sam',
   age: 26,
   job: 'teacher',
   testMethod : function() {
     //do something
   }
};

var person2 = {
   name: 'John',
   age: 30,
   job: 'student'
};

Я хочу позаимствовать testMethod от person1 до person2.

//Using = operator
person2.testMethod = person1.testMethod;
person2.testMethod();

//Using call method
person1.testMethod.call(person2)

В чем разница между этими двумя способами заимствования?

1 Ответ

1 голос
/ 03 апреля 2020

Метод call не добавит testMethod к вашему второму объекту person2, он изменит только привязку this внутри testMethod тела, поэтому вместо this будет указано person1 это будет указывать на person2.

Пример :

var person1 = {
  firstName:"John",
  lastName: "Doe",
  fullName: function() {
    return this.firstName + " " + this.lastName;
  }
}
var person2 = {
  firstName:"Mary",
  lastName: "Doe"
}

person1.fullName(); //this will yield John Doe
person1.fullName.call(person2); //this will yield Mary Doe

person2.fullName = person1.fullName;
person2.fullName(); //this will yield also Mary Doe

От MDN:

Вызов () допускает функцию / метод, принадлежащий одному объекту для быть назначенным и вызванным для другого объекта.

call () предоставляет новое значение этого функции / методу. С помощью call () вы можете написать метод один раз, а затем наследовать его в другом объекте, без необходимости переписывать метод для нового объекта.

...