Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как работает оператор new когда функция-конструктор что-то возвращает ? (https://javascript.ru/forum/misc/15612-kak-rabotaet-operator-new-kogda-funkciya-konstruktor-chto-vozvrashhaet.html)

olek 06.03.2011 09:22

Как работает оператор new когда функция-конструктор что-то возвращает ?
 
Хочу разобраться с одной вещью, как работает оператор new когда функция конструктор возвращает что-то с помощью return.
Вот такой пример:
function fA(){
          this.a = 1;
          return function(){
                         this.a = 2;
                       }
}

var vA = new fA();
alert(typeof vA + " = " + vA);//  function = function () { this.a = 2; }

Здесь мы при алерте получили "function = function () { this.a = 2; }
" вместо "object = [object Object]". Я понимаю это так:
new сначала создает новый объект с неопределенными свойствами, затем он вызывает функцию-конструктор. Так как функция-конструктор у нас возвращаєт функцию то в результате мы получаем не объект {a:1} а функцию function () { this.a = 2; } .
Но вот ещё пример:
function fB(){
          this.b = 3;
          return 4;
}

var vB = new fB();
alert(typeof vB + " = " + vB);//  object = [object Object]


в этом случае по моим размышлениям алерт должен выдать сообщение "number = 4" а в действительности - "object = [object Object]".

Почему при создании объекта з помощью оператора new когда функция-конструктор возвращает (return) функцию или объект мы вместо нового объекта получаем возвращаемое значение, а когда функция-конструктор возвращает базовый тип (return 5 или return "тест string") получаем новий объект созданый new и инициализованый функцией-конструктором?

monolithed 06.03.2011 10:43

возможно вы это имеете ввиду:

function Foo() {
    this.a = 2;
    
    this.b = function(a) { 
        return this.a*a; 
    };
}

var obj = new Foo;

alert([obj.a, obj.b(2)]);

Sweet 06.03.2011 12:17

olek, давай ты почитаешь стандарт и расскажешь нам, почему так? Можешь начать здесь:)
Если очень хочешь примитивных значений, можно, видимо, так:
function test(){
  this.some = 3;
  return new Number(4);
};

alert([ new test(), typeof Number( new test() ) ]);


Часовой пояс GMT +3, время: 03:52.