На чем происходит вызов?

Я не совсем понимаю как правильно говорить. Например, в первом случае вызов метода 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 шт):

Автор решения: EzioMercer

Думаю понятнее будет на примерах показать

В первом случае мы вызываем статический метод. В моём примере это метод 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());

→ Ссылка