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 () принимает единственный массив аргументов .