Реализация JavaScript, которая позволяет получить доступ к [[Call]] - PullRequest
2 голосов
/ 20 декабря 2008

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 20 декабря 2008

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

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

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

myfunc.avalue=5;

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

myfunc(); //Alerts 5
myfunc.anotherfunc(); //Alerts 5
1 голос
/ 15 июня 2009

Приложения, использующие реализацию Mozilla Spidermonkey в Javascript 1.5 или более поздней версии (например, 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>
1 голос
/ 21 декабря 2008

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

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

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

0 голосов
/ 20 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...