JavaScript
- 38 ответов
- 0 вопросов
18
Вклад в тег
Array.prototype
, Number.prototype
. В нём хранятся методы и свойства этого объекта, а также... (далее переходим к __proto__
)__proto__
- тоже ссылка на прототип. Например, введите в консоли []
и раскройте ветвь. У вас всего два свойства. Одно - length
- количество элементов в массиве. Другое - __proto__
. А где же все методы, которые мы можем использовать с массивами filter
, map
, slice
и так далее? Они лежат в __proto__
. Более подробно здесь. Array.prototype
. Там вы увидите тот самый __proto__
, являющийся ссылкой на Object.prototype
. Вся инфа по ссылке выше.call
и apply
постепенно уходят из обихода, но тем не менее про них важно знать и уметь ими пользоваться. Эти методы позволяют вызвать функцию в контексте, который вам необходим. this
в контексте другого объекта, у которого этого метода нет. Вы можете сделать следующее:var o_1 = {
name: 'Peter',
hello: function () {
console.log('Hello, ' + this.name);
}
};
var o_2 = {
name: 'Jane'
};
o_1.hello.call(o_2); // Фактически вы говорите "вызови метод такой-то для объекта такого-то"
var o_1 = {
name: 'Peter',
hello: function () {
console.log('Hello, ' + this.name);
},
sum: function (a, b) {
console.log(`${this.name} sum a and b to ${a + b}`);
}
};
var o_2 = {
name: 'Jane'
};
o_1.sum.call(o_2, 2, 4);
o_1.sum.apply(o_2, [1, 2]);
call
принимает список аргументов, начиная со второго, а apply
, соответственно, принимает массив.null
.var o = {
sum: function (a, b) {
console.log(a + b);
}
}
o.sum.call(null, 1, 2);
o.sum.apply(null, [1, 2]);
bind
тоже довольно простая штука. Отчасти он похож на предыдущие два метода, за исключением того, что он не вызывает функцию сразу же.var o = {
a: 1,
b: 2,
sum: function () {
console.log(this.a + this.b);
}
};
var o2 = {
a: 10,
b: 20
};
var o2Sum = o.sum.bind(o2);
o2Sum();
bind
можно каррировать функции.