На чем происходит вызов?
Я не совсем понимаю как правильно говорить. Например, в первом случае вызов метода value() на функции-конструкторе или на встроенном объекте Object?
let obj = { num1: 1, num2: 2, num3: 3 };
let values = Object.values(obj); //на чем происходит вызов?
Здесь вызов происходит на самом массиве?
let arr = [1, 2, 3, 4];
let iteratorValues = arr.values(); //?
А в чем вообще разница между 1-ым и 2-ым? Насколько я знаю, прототип, который есть у встроенной функции-конструктора - т.е. встроенный прототип, есть и у обычного объекта, который был создан этой функцией-конструкцией. Ну то есть если какой-то прототип есть у Object (встроенная функция-конструктор), то впоследствии этот прототип также будет и у того объекта, который этой функцией Object создается. То есть я имею в виду почему я не могу вызвать напрямую obj.values()? Ведь по идее, если этот метод есть у Object, то он должен быть и у obj.
Или values() находится не в прототипах, а в самом объекте Object?
Ответы (1 шт):
Думаю понятнее будет на примерах показать
В первом случае мы вызываем статический метод. В моём примере это метод getAsObj. Такого метода нет у переменной myMap, т.е. нет у экземпляра, потому в консоли мы увидим ошибку. Если метод статический, то его надо вызывать так НазваниеКласса.имяСтатическойФункции. Ни статические методы, ни статические свойства не могут быть вызваны для экземпляров класса. Вместо этого они вызываются в самом классе. Потому я могу спокойно вызывать getAsObj у класса MyMap
class MyMap {
map;
static getAsObj(x) {
const obj = {};
for(const [key, value] of x) obj[key] = value;
return obj;
}
constructor() {
this.map = new Map();
}
}
const myMap = new MyMap();
myMap.map.set(1, 2);
myMap.map.set(3, 4);
myMap.map.set(5, 6);
try {
console.log(myMap.getAsObj(myMap.map));
} catch (e) {
console.log(e.message);
}
console.log(MyMap.getAsObj(myMap.map));
Во втором случае мы вызываем обычный метод. В моём примере это метод getAsObj, который спокойно могу вызывать у экземпляра класса. Но зато теперь я не могу вызывать getAsObj у самого класса, потому мы увидим ошибку в консоли
class MyMap {
map;
getAsObj() {
const obj = {};
for(const [key, value] of this.map) {
obj[key] = value;
}
return obj;
}
constructor() {
this.map = new Map();
}
}
const myMap = new MyMap();
myMap.map.set(1, 2);
myMap.map.set(3, 4);
myMap.map.set(5, 6);
try {
console.log(MyMap.getAsObj());
} catch (e) {
console.log(e.message);
}
console.log(myMap.getAsObj());