1 (изменено: im2002, 2014-09-20 11:42:34)

Тема: JS: непонятное поведение arguments.callee

Не понятно, почему объект не создаётся ф-ей конструктором  $test, если присутствует инструкция return arguments.callee;

function $test(a, b)                    
    {
    this.prop1 = a;
    this.prop2 = b;                    
    return arguments.callee;
    }
var ObjTst = new $test(1, false);        
var lst = "";
for(i in ObjTst)
    {
    lst += "Имя св-ва: " + i + "\tЗначение св-ва: " + ObjTst[i] + "\n";
    }
WScript.Echo(lst);    

2

Re: JS: непонятное поведение arguments.callee

Наверно, потому, что callee — это сам конструктор, а не создаваемый им объект.

3

Re: JS: непонятное поведение arguments.callee

YMP пишет:

Наверно, потому, что callee — это сам конструктор, а не создаваемый им объект.

понятно, что arguments.callee возвращает ссылку на саму ф-ю, но что мешает при пом. new создать объект с двумя св-ми в примере выше? Смысл как-то непонятен... если в приведённом примере заменить

return arguments.callee;

на

return 10;

к примеру, то ведь объект ObjTst "создаётся", его св-ва и значения доступны так сказать... Непонятно, почему в случае

return arguments.callee;

объект не создаётся... или что при этом происходит?

4

Re: JS: непонятное поведение arguments.callee

Не знаю. Конструктор, по кр. мере, вызывается. Может, разница в том, что 10 — не объект, поэтому его нельзя спутать с ним. А если вернуть объект, то он и принимается за нужный. Например, объект String даёт тот же эффект.

5

Re: JS: непонятное поведение arguments.callee

arguments - специальное свойство объекта вызова, ссылающееся на объект - как ни странно - Arguments, представляющий собой  нечто вроде массива, позволяющего извлекать переданные функции значения по номеру (а не по имени).
callee - дополнительное свойство Arguments, ссылающееся на исполняемую в данный момент функцию, которое можно использовать, скажем, для рекурсивного вызова неименованных фунций. Например:

var factorial = function(x) {
   if (x < 2) return 1;
   return x * arguments.callee(x - 1);
}

6

Re: JS: непонятное поведение arguments.callee

greg zakharov пишет:

arguments - специальное свойство объекта вызова, ссылающееся на объект.... и т. д.


Это всё понятно, просто, если бы меня спросили что будет результатом отработки скрипта из 1-ого поста (не проверяя результат, путём запуска js-файла), то я бы сказал, что это будет сообщение из 2-ух строк:

Имя св-ва: prop1           Значение св-ва: 1
Имя св-ва: prop2           Значение св-ва: false

и был бы не прав... так вот и пытался понять, как JS работает в указанном примере? что в кишках его происходит?

7 (изменено: Spy00000, 2014-09-20 21:25:00)

Re: JS: непонятное поведение arguments.callee

Это нормальное поведение операции new, которое описано в стандарте языка.
Операция new создаёт новый объект и вызывает функцию-конструктор, привязав её к созданному объекту.
Если функцию-конструктор возвращает НЕ объект (а в JavaScript, всё, что не примитивные типы, это объекты, включая функции, массивы, даты и прочее), то результатом операции new будет созданный ею объект.
Если функцию-конструктор возвращает любой объект, то результатом операции new будет переданный ей функцией-конструктором объект, а не тот объект, который она (операция new) создала.

Вот, например, массив:

function $test(a, b)                    
    {
    this.prop1 = a;
    this.prop2 = b;                    
    return [1,2,3,4];
    }
var ObjTst = new $test(1, false);        
var lst = 'Тип: ' + typeof ObjTst + '\nКонструктор: ' + ObjTst.constructor + '\n\n';

for(i in ObjTst)
    {
    lst += "Имя св-ва: " + i + "\tЗначение св-ва: " + ObjTst[i] + "\n";
    }
WScript.Echo(lst); 

В варианте с "return arguments.callee;" результатом функции-конструктора является объект типа "Функция", которые есть наследник типа "Объект", поэтому возвращается ссылка на него, а не на созданный объект.

8

Re: JS: непонятное поведение arguments.callee

Spy00000 пишет:

...
Если функцию-конструктор возвращает любой объект, то результатом операции new будет переданный ей функцией-конструктором объект, а не тот объект, который она (операция new) создала...

Это конечно всё объясняет, но "описание" такого поведения JS в литературе не встречал, а додумать такой простейший пример, какой вы привели для демонстрации, видимо "ума не хватило". Спасибо, теперь всё понятно!

9 (изменено: DanceWoman, 2014-09-22 17:32:18)

Re: JS: непонятное поведение arguments.callee

im2002 пишет:
Spy00000 пишет:

Если функцию-конструктор возвращает обеды любой объект, то результатом операции new будет переданный ей функцией-конструктором объект, а не тот объект, который она (операция new) создала...

Это конечно всё объясняет, но "описание" такого поведения JS в литературе не встречал, а додумать такой простейший пример, какой вы привели для демонстрации, видимо "ума не хватило". Спасибо, теперь всё понятно!

А мне ещё нужно немного переварить прочитанное...

Кодэры код кодировали кодировали, да не не выкодирыровали... :)