OK:
var Foo = new function(){
this.A = 1;
this.B = 2;
};
Мы получили var Foo = new
функцию, — означает, что среда выполнения будет вызывать эту функцию с this
набором для вновь построенного объекта, внутренний прототип ссылка будет установлен на значение свойства «prototype» этой функции. Поскольку это просто анонимная функция, созданная здесь, при инициализации, ее свойство «prototype» - это просто пустой пустой объект, поэтому он действительно ничего не делает. Функция конструктора инициализирует два свойства нового объекта, а новый объект - возвращаемое значение из выражения new
.Таким образом, Foo
назначается ссылка на этот построенный объект, и объект имеет пару назначенных свойств. Он также имеет цепочку прототипов, которая включает пустой объект из функции анонимного конструктора, а затем после этого прототип унаследован от конструктора Object.
В этом:
var Bar = {
A: 1,
B: 2
};
мы имеем переменную (Bar
) быть установлен в результате выражения инициализатора объекта. Это всегда создает простой объект, который наследуется только от прототипа Object. Единственный способ, которым этот объект отличается от объекта Foo
, состоит в том, что объект Foo
имеет дополнительный (пустой) объект в своей цепочке прототипов.
Итак:
Foo
будет в конечном итоге быть обычный объект, а не функция.
Bar
также будет простым объектом, более явно не функцией.
Foo
и Bar
будет похож но не идентичны (ну, два разных объекта никогда не идентичны, но я имею в виду с точки зрения их конкретных характеристик), поскольку Foo
имеет тот дополнительный пустой объект в его цепочке прототипов.
Да, вы нашли разницу. У них разные прототипы. –
Существует не так много практических различий, кроме различий в прототипе, но поскольку прототип ничего не имеет для него для первого объекта, он ничего не делает. – Pointy
вы можете видеть Foo как класс, но Bar - это объект –