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 можно каррировать функции.