Как можно получить доступ к объекту функции в явном виде? Вот код:
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 объект связанны хоть как-нибудь?
В данном случае произошла путаница из-за непонимания что именно возвращает typeof
.
Если обратиться к спецификации, можно заметить, что данный оператор может возвращать строго заданный набор значений.
Конкретно в случае функции используется строка
Object (implements [[Call]]) ----> "function"
То есть если у объекта есть внутреннее поле [[Call]]
данный оператор вернет "function"
. Что не делает этот объект менее объектом, чем любой другой.
Таким образом функция table
- вполне себе является объектом.
Следующим доказательством этого может служить то, что при вызове table.call(table)
, поле spoons
добавилось непосредственно в table
, как в любой другой объект. При этом все еще осталась возможность вызвать table
как функцию.
Или есть всё таки способ отобразить typeof(table)===object
?
Такого способа нет, так как нет доступа к внутреннему полю [[Call]]
.
Действильно, функции в js являются объектами. Чтобы убедиться в этом подручными средствами попробуйте отрыть консоль браузера и добавить определение вашей функции table
:
function table(){
this.spoons=10;
}
Если затем ввести window
и развернуть глобальный объект, то можно найти свойство table
предтавленное следующим образом:
Как видите, это обычный объект со своим прототипом и т.п.
Подробнее советую почитать тут.
Как работать с Amplitudejs через Ajax? Если страница загружена динамически, то инициализация не происходит