Конструктор функция
В чем разница между этими двумя кодами?
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);
Сначала они оба создают новый объект, и объекту назначается следующий код внутри них. Затем они выполняют код в теле функции и могут вернуть значение.