Можно ли получить доступ к объекту функции в явном виде?

146
27 января 2020, 07:00

Как можно получить доступ к объекту функции в явном виде? Вот код:

function table(){ 
  this.spoons=10; 
} 
 
document.write(typeof(table)+"<br>")    // function 
table.call(table)    //указываю в явном виде, на что будет указывать this в foo 
document.write(table.hasOwnProperty("spoons")+"<br>")    //true 
document.write(table.spoons+"<br>")    //обращаемся как к обычному свойству объекта

Я создал переменную spoons, предположительно добавив её в объект, хм НО В КАКОЙ? Ведь typeof(table)===function, ну а бредовая и не рабочая команда typeof(table.call(foo))(с помощью которой я предположил, что смогу докопаться до объекта функции) - бредовая, и не работает!

Получается "объект функции" это как Йети? Все в курсе, но никто не видел?

Или есть всё таки способ отобразить typeof(table)===object?

Просто все,и по всюду говорят, что функции это объекты в js, ну вот и стало интересно! Спасибо!

П.С.: table функция и table объект связанны хоть как-нибудь?

Answer 1

В данном случае произошла путаница из-за непонимания что именно возвращает typeof.

Если обратиться к спецификации, можно заметить, что данный оператор может возвращать строго заданный набор значений.

Конкретно в случае функции используется строка

Object (implements [[Call]]) ----> "function"

То есть если у объекта есть внутреннее поле [[Call]] данный оператор вернет "function". Что не делает этот объект менее объектом, чем любой другой.

Таким образом функция table - вполне себе является объектом.

Следующим доказательством этого может служить то, что при вызове table.call(table), поле spoons добавилось непосредственно в table, как в любой другой объект. При этом все еще осталась возможность вызвать table как функцию.

Или есть всё таки способ отобразить typeof(table)===object?

Такого способа нет, так как нет доступа к внутреннему полю [[Call]].

Answer 2

Действильно, функции в js являются объектами. Чтобы убедиться в этом подручными средствами попробуйте отрыть консоль браузера и добавить определение вашей функции table:

function table(){
  this.spoons=10;
}

Если затем ввести window и развернуть глобальный объект, то можно найти свойство table предтавленное следующим образом:

Как видите, это обычный объект со своим прототипом и т.п.

Подробнее советую почитать тут.

READ ALSO
Amplitude.js и Ajax

Amplitude.js и Ajax

Как работать с Amplitudejs через Ajax? Если страница загружена динамически, то инициализация не происходит

144
Динамические элементы в ссылке

Динамические элементы в ссылке

Есть несколько ссылок, такого вида:

144