Конструктор функция

В чем разница между этими двумя кодами?

  let user = new function() {
      this.name = "John";
      this.isAdmin = false;
  }

против

 let user =  {
    name: "John",
    isAdmin: false
}

2 ответа

Единственная разница в том, что первый user, созданный через new, имеет внутренний прототип (почти) пустого объекта, и этот пустой объект наследуется от Object.prototype:

instance <- (empty object) <- Object.prototype

let user = new function() {
  this.name = "John";
  this.isAdmin = false;
};

console.log(user);

Технически объект не совсем пустой, у него нет перечислимогоconstructor свойство, указывающее на функцию

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

function Foo() {
  this.name = "John";
  this.isAdmin = false;
}
Foo.prototype.prop = 'val';
let user = new Foo();

console.log(user);
console.log(Object.getPrototypeOf(user).hasOwnProperty('prop'));
console.log(Object.getPrototypeOf(user) === Foo.prototype);

С другой стороны, пользователь из литерала объекта наследуется непосредственно от Object.prototype:

instance <- Object.prototype

 let user =  {
    name: "John",
    isAdmin: false
}
console.log(Object.getPrototypeOf(user) === Object.prototype);

Сначала они оба создают новый объект, и объекту назначается следующий код внутри них. Затем они выполняют код в теле функции и могут вернуть значение.

Другие вопросы по тегам