2016-04-08 2 views
3
var Foo = new function(){ 
    this.A = 1; 
    this.B = 2; 
}; 
var Bar = { 
    A: 1, 
    B: 2 
}; 
typeof Foo === "object" 
typeof Bar === "object" 

В чем разница между этими двумя?Разница между `new function() {this.x = 1}` и `{x: 1}`

Я только нашел их __proto__ объекты по-другому:

+1

Да, вы нашли разницу. У них разные прототипы. –

+0

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

+0

вы можете видеть Foo как класс, но Bar - это объект –

ответ

-1

Первая функция конструктор, который выводит объект функции (то, что относится к Foo), а другой просто обычный объект javascript.

+0

Вы пропустили тот факт, что конструктор ** называется ** через оператор 'new'. – Pointy

+0

@Pointy Я предполагаю, что он тонко подразумевал, что с помощью «конструктора функций», но быть точным было бы хорошо –

+0

@Ji_in_coding Foo - это всего лишь объект; он не является функцией и не является конструктором. – Pointy

-1

В Javascript все функции являются объектами. И в вашем случае Foo и Bar одинаковы, но вы можете построить первый.

В тот же знак, я бы сказал, что ключ проницательность с функциями конструктора в данном случае является то, что если мы имеем:

function myFoo(){ 
    this.A = 1; 
    this.B = 2; 
}; 

затем

var Foo1 = new myFoo(); 

контекст это является Foo ,

var Foo2 = myFoo(); 

этот связан с текущим контекстом, объект окна в этом случае (то есть вы на самом деле есть window.A = 1).

См. Документацию MDN для более подробного описания.

Function

Constructor

new operator

+0

Ваш ответ верный, но в этом случае ни Foo, ни Bar не являются функциями. Это оба объекта. – Pointy

+0

новый функция() {}, не новая функция() {}(). – djechlin

+1

@djechlin '()' является необязательным! – Pointy

-1

Первая нота it's irrelevant that you omitted the parentheses when calling your anonymous function with new. JSLint будет кричать на вас, потому что это сбивает с толку, но это то, что происходит.

Я уверен, что внутренний прототип - единственное отличие. Это может быть проще записать это, как обычно используется.

var Car = function() { 
    this.seats = 4; 
}; 

var car1 = new Car(); 
var car2 = { 
    seats: 4 
}; 

Чтение этого мне ясно, что car1 является объектом, внутренний прототип Car - в вашем случае является анонимная функция непосредственно не принадлежит переменной - и car2 является объектом, внутренний прототип Object.

+0

Прототипом 'car1' будет значение свойства« prototype »' Car', а не 'Car'. – Pointy

0

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 имеет тот дополнительный пустой объект в его цепочке прототипов.
Смежные вопросы