Реализация JavaScript, позволяющая получить доступ к [[Call]]

Стандарт ECMA определяет скрытое внутреннее свойство [[Call]], которое, если оно реализовано, означает, что объект может быть вызван / является функцией.

В Python происходит нечто подобное, за исключением того, что вы можете переопределить это самостоятельно, чтобы создать свои собственные вызываемые объекты:

>>> class B:
...     def __call__(self, x,y): print x,y
...
>>> inst = B()
>>> inst(1,2)
1, 2

Есть ли аналогичный механизм в стандартном JavaScript? Если нет, то как насчет любой из текущих реализаций JavaScript?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
244
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Насколько я знаю, это невозможно. Предполагается, что это внутреннее свойство объекта, а не сам сценарий. Я знаю только один способ - определить функцию.

Однако, поскольку функции являются первоклассными гражданами, вы можете добавлять к ним свойства:

function myfunc(){
  var myself = arguments.callee;
  myself.anotherfunc();
}

myfunc.avalue=5;

myfunc.anotherfunc=function(){
  alert(this.avalue);
}

myfunc(); //Alerts 5
myfunc.anotherfunc(); //Alerts 5

Пока это невозможно: [[Call]] скрыт и не доступен напрямую во всех реализациях соответствия. Это может измениться в новый стандарт ECMAScript.

[[Call]] - это внутреннее свойство, используемое для описания определенной части функциональности в спецификации языка. Нет никакой гарантии, что такое свойство доступно даже в интерпретаторе. Есть много других свойств и объектов, на которые ссылаются в спецификации, такие как объект Completion, который необходим только в том случае, если вы реализовали язык как интерпретатор AST, который использовали KJS и JavaScriptCore (KJS, KJS == вилка WebKit). делать. Интерпретаторы, не основанные на AST (SpiderMonkey, новые механизмы выполнения KJS и JavaScriptCore FrostByte и SquirrelFish, возможно, движок Opera JS и V8) не нуждаются в большом количестве этих конструкций, поскольку они используются в основном для описания поведения, а не выполнение.

Есть еще одна причина, по которой такой доступ недоступен - многие из этих свойств настолько присущи интерпретатору, что разрешение настраиваемого поведения может повлиять на производительность независимо от того, используются эти функции или нет - например, API JSC предоставляет механизм для embedder, чтобы переопределить некоторые из этих свойств, и поддержка этого даже на уровне C фактически оказывает влияние на производительность измеримый.

[Обновлено: небольшое примечание, когда я говорю «интпредставитель», я имею в виду в общем смысле - это может быть интерпретация AST, байт-кода или машинного кода (например, jit)]

Приложения, использующие реализацию Javascript 1.5 или более поздней версии Mozilla Spidermonkey (например, Firefox), имеют доступ к механизму __noSuchMethod__:

c:\>jsdb
js>x = {};
[object Object]
js>x.__noSuchMethod__ = function(id,args) {writeln('you just called: '+id+'()');}
function (id, args) {
    writeln("you just called: " + id + "()");
}
js>x.foo()
you just called: foo()
js>x.bar()
you just called: bar()
js>

Другие вопросы по теме