Function.prototype.call()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since иÑÐ»Ñ 2015 г..
Сводка
ÐеÑод call() вÑзÑÐ²Ð°ÐµÑ ÑÑнкÑÐ¸Ñ Ñ ÑказаннÑм знаÑением this и индивидÑалÑно пÑедоÑÑавленнÑми аÑгÑменÑами.
ÐÑимеÑание:
ХоÑÑ ÑинÑакÑÐ¸Ñ ÑÑой ÑÑнкÑии пÑакÑиÑеÑки полноÑÑÑÑ Ð¸Ð´ÐµÐ½ÑиÑен ÑÑнкÑии apply(), ÑÑндаменÑалÑное ÑазлиÑие Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо ÑÑнкÑÐ¸Ñ call() пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑпиÑок аÑгÑменÑов, в Ñо вÑемÑ, как ÑÑнкÑÐ¸Ñ apply() - одиноÑнÑй маÑÑив аÑгÑменÑов.
СинÑакÑиÑ
fun.call(thisArg[, arg1[, arg2[, ...]]])
ÐаÑамеÑÑÑ
thisArg-
ÐнаÑение
this, пÑедоÑÑавлÑемое Ð´Ð»Ñ Ð²Ñзова ÑÑнкÑииfun. ÐбÑаÑиÑе внимание, ÑÑоthisÐ¼Ð¾Ð¶ÐµÑ Ð½Ðµ бÑÑÑ ÑеалÑнÑм знаÑением, видимÑм ÑÑим меÑодом: еÑли меÑод ÑвлÑеÑÑÑ ÑÑнкÑией в неÑÑÑогом Ñежиме, знаÑениÑnullиundefinedбÑдÑÑ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑм обÑекÑом, а пÑимиÑивнÑе знаÑÐµÐ½Ð¸Ñ Ð±ÑдÑÑ ÑÐ¿Ð°ÐºÐ¾Ð²Ð°Ð½Ñ Ð² обÑекÑÑ. arg1, arg2, ...-
ÐÑгÑменÑÑ Ð´Ð»Ñ Ð¾Ð±ÑекÑа.
ÐпиÑание
ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑиÑваиваÑÑ ÑазлиÑнÑе обÑекÑÑ this пÑи вÑзове ÑÑÑеÑÑвÑÑÑей ÑÑнкÑии. this ÑÑÑлаеÑÑÑ Ð½Ð° ÑекÑÑий обÑекÑ, вÑзвавÑий обÑекÑ. С помоÑÑÑ call Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе напиÑаÑÑ Ð¼ÐµÑод один Ñаз, а заÑем наÑледоваÑÑ ÐµÐ³Ð¾ в дÑÑгиÑ
обÑекÑаÑ
, без необÑ
одимоÑÑи пеÑепиÑÑваÑÑ Ð¼ÐµÑод Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ нового обÑекÑа.
ÐÑимеÑÑ
>ÐÑимеÑ: иÑполÑзование call Ð´Ð»Ñ ÑвÑзи конÑÑÑÑкÑоÑов обÑекÑа в ÑепоÑкÑ
ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¼ÐµÑод call Ð´Ð»Ñ Ð¾Ð±ÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² ÑепоÑÐºÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑов обÑекÑа, как в Java. Ð ÑледÑÑÑем пÑимеÑе Ð´Ð»Ñ Ð¾Ð±ÑекÑа пÑодÑкÑа Product обÑÑвлен конÑÑÑÑкÑÐ¾Ñ Ñ Ð´Ð²ÑÐ¼Ñ Ð¿Ð°ÑамеÑÑами, названием name и Ñеной price. ÐÑодÑÐºÑ Ð¸Ð½Ð¸ÑиализиÑÑÐµÑ ÑвойÑÑва name и price, а ÑпеÑиализиÑованнÑе ÑÑнкÑии опÑеделÑÑÑ ÐµÑÑ ÐºÐ°ÑегоÑÐ¸Ñ category.
function Product(name, price) {
this.name = name;
this.price = price;
if (price < 0) {
throw RangeError(
"ÐелÑÐ·Ñ ÑоздаÑÑ Ð¿ÑодÑÐºÑ " + this.name + " Ñ Ð¾ÑÑиÑаÑелÑной Ñеной",
);
}
}
function Food(name, price) {
Product.call(this, name, price);
this.category = "еда";
}
Food.prototype = Object.create(Product.prototype);
function Toy(name, price) {
Product.call(this, name, price);
this.category = "игÑÑÑка";
}
Toy.prototype = Object.create(Product.prototype);
var cheese = new Food("ÑеÑа", 5);
var fun = new Toy("ÑобоÑ", 40);
ÐÑимеÑ: иÑполÑзование call Ð´Ð»Ñ Ð²Ñзова анонимной ÑÑнкÑии
Ð ÑÑом ÑиÑÑо иÑкÑÑÑÑвенном пÑимеÑе, Ð¼Ñ ÑоздаÑм анонимнÑÑ ÑÑнкÑÐ¸Ñ Ð¸ иÑполÑзÑем call Ð´Ð»Ñ Ð²Ñзова ÐµÑ Ð½Ð° каждом ÑлеменÑе маÑÑива. ÐÐ»Ð°Ð²Ð½Ð°Ñ Ð·Ð°Ð´Ð°Ñа анонимной ÑÑнкÑии здеÑÑ â добавиÑÑ ÑÑнкÑÐ¸Ñ Ð¿ÐµÑаÑи в каждÑй обÑекÑ, ÑпоÑобнÑÑ Ð½Ð°Ð¿ÐµÑаÑаÑÑ Ð¿ÑавилÑнÑй Ð¸Ð½Ð´ÐµÐºÑ Ð¾Ð±ÑекÑа в маÑÑиве. ÐеÑедаÑа обÑекÑа в каÑеÑÑве знаÑÐµÐ½Ð¸Ñ this не ÑвлÑеÑÑÑ Ð¾ÑÑÑой необÑ
одимоÑÑÑÑ, но Ð¼Ñ Ð´ÐµÐ»Ð°ÐµÐ¼ ÑÑо в ÑелÑÑ
обÑÑÑнениÑ.
var animals = [
{ species: "Ðев", name: "ÐоÑолÑ" },
{ species: "ÐиÑ", name: "ФÑйл" },
];
for (var i = 0; i < animals.length; i++) {
(function (i) {
this.print = function () {
console.log("#" + i + " " + this.species + ": " + this.name);
};
this.print();
}).call(animals[i], i);
}
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-function.prototype.call> |