fruity4pie
@fruity4pie
A

Что делает оператор new?

Понятно, что это конструктор, который создает пустой объект и присваивает его this; присваивает свойства и методы и возвращает this.

Но что происходит когда мы в этот самый конструктор вписываем переменные, другие объекты и оперируем ими:

function Human() {
  let body = {
    legs: 2,
    arms: 2
  }

  this.go = function() {
    this.steps = 0;
    if(body.legs === 2) {
         this.steps += 2;
    }
    this.steps += 1;
    
  }
  
}


??

Правильно ли я понимаю, что создается область видимости ограниченная конструктором, в которой доступны оные переменные/объекты ?
  • Вопрос задан
  • 1656 просмотров
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Добавлю к вышенаписанному, что работу оператора new можно симитировать следующей функцией:
function newExpression(constructor) {
  if ( typeof constructor !== 'function') {
    throw new TypeError(constructor + 'is not a constructor');
  }

  var args = Array.prototype.slice.call(arguments, 1);
  var obj = Object.create(constructor.prototype);
  
  constructor.apply(obj, args);
  
  return obj;
}

Демо.
В отличии такой имитации настоящий оператор new успешно создаст экземпляр даже по забинженому на другой контекст конструктору (по факту, возвращенной привязанной функции), так как оператор new игнорирует преданное значение this. Аргументы же будут применены из [[BoundArguments]]:
var User = function(name) {
  this.name = name;
}

User.prototype.getName = function() {
  return this.name;
}

const obj = {};

User = User.bind(obj, "Sarah");

var john = new User('John');

console.log(john.getName()); // 'Sarah'


Спецификации new и [[Construct]]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
.
Когда исполняется new Foo(...) , происходит следующее:

1. Создается новый объект, наследующий Foo.prototype.
2. Вызывается конструктор — функция Foo с указанными аргументами и this, привязанным к только что созданному объекту. new Foo эквивалентно new Foo(), то есть если аргументы не указаны, Foo вызывается без аргументов.
3. Результатом выражения new становится объект, возвращенный конструктором. Если конструктор не возвращет объект явно, используется объект из п. 1. (Обычно конструкторы не возвращают значение, но они могут делать это, если нужно переопределить обычный процесс создания объектов.)
https://developer.mozilla.org/ru/docs/Web/JavaScri...

И да, new - это не конструктор. Конструктор обычно объявлен внутри класса или прототипа.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Biganto Москва
от 130 000 до 130 000 руб.
от 2 500 до 4 000 usd.
HTML Academy Москва
от 85 000 до 100 000 руб.
14 авг. 2018, в 18:01
12000 руб./за проект
14 авг. 2018, в 17:33
5000 руб./за проект
14 авг. 2018, в 16:33
1000 руб./за проект