Подтвердить что ты не робот

RETURN из конструктора необходимо при создании объекта с новым

если у меня есть такая функция:

function Apple(){
    this.color = "green";
    return this;
}

При создании объекта, подобного этому:

var my_obj = new Apple();

является ли строка return this; необходимой и/или она действительна по языковой ссылке?

4b9b3361

Ответ 1

Нет, возврат this не требуется, но он действителен. Если возвращаемое значение является объектом, new вернет этот объект вместо вновь созданного объекта.

См. пункты 11.2.2 и 13.2.2 ECMAScript 5:

Новый оператор вызывает внутренний конструктор [[Construct]] в конструкторе (обычно это функция):

11.2.2 Новый оператор

Произведение NewExpression: новое NewExpression оценивается следующим образом:

  • Пусть ref является результатом оценки NewExpression.
  • Пусть конструктор будет GetValue (ref).
  • Если тип (конструктор) не является объектом, вызовите исключение TypeError.
  • Если конструктор не реализует внутренний метод [[Construct]], создайте исключение TypeError.
  • Возвращает результат вызова внутреннего метода [[Construct]] в конструкторе, не предоставляя никаких аргументов (т.е. пустого списка аргументов).

Внутренний метод функций [[Construct]] описан в пункте 13.2.2:

13.2.2 [[Construct]]

Когда внутренний метод [[Construct]] для объекта функции F вызывается с возможным пустым списком аргументов, выполняются следующие шаги:

  • Пусть obj - только что созданный собственный объект ECMAScript.
  • Задайте все внутренние методы obj, как указано в 8.12.
  • Установить внутреннее свойство [[Class]] объекта obj в "Object".
  • Установите внутреннее свойство [[Расширяемое]] объекта obj в значение true.
  • Пусть proto будет значением вызова внутреннего свойства [[Get]] F с аргументом "prototype".
  • Если Type (proto) - Object, установите внутреннее свойство [[Prototype]] для obj для прото.
  • Если тип (proto) не является объектом, установите внутреннее свойство [[Prototype]] объекта obj для стандартного встроенного прототипа объекта объект, как описано в 15.2.4.
  • Пусть результат будет вызван внутренним свойством [[Call]] для F, предоставив obj как это значение и предоставив список аргументов, переданный в [[Construct]] в качестве аргументов.
  • Если тип (результат) - это объект, то возвращает результат.
  • Возврат obj.

Ответ 2

Нет необходимости, конструктор автоматически возвращает вновь созданный объект.

О явном возвращении значения из конструктора на этой странице есть хорошая информация: JavaScript: Возвращаемое значение конструктора

Цитата:

Если функция-конструктор ничего не возвращает, значение null или любое значение атома/не-объекта, то указанное значение игнорируется, а вновь созданная ссылка на объект возвращается обратно вызывающему. Например, возвращаемое значение 0 (ноль) из функции конструктора будет проигнорировано.

и

... вторая часть магии, которой избегали выше, - это способность конструктора возвращать определенный, возможно, уже существующий объект, а не ссылку на новый экземпляр. Это позволит вам управлять количеством фактических экземпляров самостоятельно, если это необходимо; возможно, из-за ограниченных ресурсов или чего-то еще.

Ответ 3

Это не обязательно.

Функция будет неявно возвращать новый Object при создании экземпляра с помощью оператора new. this будет ссылаться на этот новый объект в этом контексте.

Недействительные возвраты (такие как примитивы или не новые объекты) по-прежнему будут возвращать стандартный this.

Вы можете переопределить его, возвратив новый другой объект.

var a = function() {
    return new Number(42);
},

b = new a; // typeof b === 'number'.

jsFiddle.