@Drovosek01

Почему у созданных объектов нет методов от Object?

Читаю про дескрипторы и как-то всплыл вопрос.
Есть методы, которые вызываются напрямую от Object.
Например:
Object.keys();
Object.call();
Object.apply();
Object.defineProperty();

и т.д.

Мне непонятно, почему эти методы нельзя вызвать у любого другого объекта? Ведь при простом создании объекта у него прототипом становится Object и когда мы вызываем у объекта методы, если эти методы у него не находятся, то потом идёт поиск в прототипе (т.е. в Object).

Почему не работает такой код?
var testObj = {}
test.keys();
{}.call();
  • Вопрос задан
  • 167 просмотров
Решения вопроса 3
Это статические методы класса Object их невозможно вызвать для инстанса класса.
https://developer.mozilla.org/en-US/docs/Web/JavaS...
https://jsfiddle.net/wbyrqjus/
Ответ написан
Комментировать
space2pacman
@space2pacman
Просто царь.
Ведь при простом создании объекта у него прототипом становится Object

Не совсем
Ведь при простом создании объекта у него прототипом становится Object.prototype


Но никто не мешает сделать следуюшие)

Object.prototype.keys = Object.keys

var o = {x:1,y:2};
o.keys(o) // ["x","y"]


keys, defineProperty и прочие их нет в прототипе от того и не переносятся.
Ответ написан
Комментировать
kshshe
@kshshe
Frontend developer
keys, call, apply и т.д. -- статические методы класса Object. Они доступны у самого класса, но отсуствуют в прототипе его экземпляров.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
alvvi
@alvvi
export default apathy;
Потому что если посмотреть в консоль, станет понятно, что прототип обычных объектов - это не Object, а Object.prototype, Object же не является чьим либо прототипом, Ojbect - это нативный конструктор (то есть то что внутри него - нативный код браузера, не JS).

Но если предположить что это все же JS, выглядело бы это как-то так:
const objectPrototype = {
  toString: () => 'string!'
  // и другие методы которые мы хотим иметь на всех объектах
}

function Object() { 
  /* здесь магия нативного кода */ 
}
Object.prototype = objectPrototype

/*
* Здесь мы по сути определяем "статический" метод, он будет доступен 
* только на конструкторе Object и никогда не попадет
* в Object.prototype, следовательно новые объекты его не унаследуют
*/
Object.keys = obj => { 
  // делаем что-то и возвращаем ключи 
}

const obj = new Object()
console.log(obj.__proto__) // {toString: ƒ}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы