Вы, кажется, запутались между «объектом» (структура данных) и Object
(функцией).
Объект - это концепция в JavaScript, которая является общим контейнером для некоторых данных.Объект содержит свойства с ключами и связанными значениями.
В JavaScript все, что не является примитивом , является объектом.Это включает в себя функции, которые в основном представляют собой особый тип объекта, который можно «вызывать» с помощью синтаксиса ()
.
JavaScript предоставляет ряд встроенных функций, которые имеют различные цели.Две такие функции называются Object
и Function
.Другими словами, Object
является функцией и, следовательно, также «объектом» (структурой данных).
Давайте возьмем вашу функцию Foo
в качестве примера:
function Foo() {
var a = "3";
}
Foo
это функция.Это означает, что можно вызвать Foo
, например.var f = Foo()
.В этом случае f
будет undefined
, поскольку Foo
ничего не возвращает.
Поскольку Foo
- это функция, это также объект.Это означает, что мы также можем добавлять и считывать из него свойства:
Foo.bar = 5;
Foo.bar++;
console.log(Foo.bar); // prints 6
Обратите внимание, что эта "объектная" часть Foo
не связана с содержимым функции.Это означает, что код, который вы объявили (var a = "3"
), не имеет значения.Вы не можете получить доступ к var a
в любом случае здесь, потому что он не существует, пока вы не вызовете функцию.Если бы вы делали Foo.a
, вы не манипулировали var a
внутри функции;вы работаете со свойством a
над объектом Foo
.
Однако вы можете сделать это наоборот и получить доступ к свойствам Foo
внутри функции:
function Foo() {
var a = "3"; // a is local to this scope, you cannot get to it from outside
console.log(a); // prints 3 - local variable a is accessible inside the scope of this function
console.log(Foo.a); // prints 5 - a is a property on object Foo, and is accessible here
}
// var a inside Foo cannot be accessed here
Foo.a = 5;
Foo();
Редактировать: Re.Ваш вопрос по поводу "этого" в комментариях.this
- это специальное ключевое слово в JavaScript, которое относится к объекту.Однако этот объект является , а не самой функцией, это новый объект, который создается при вызове функции с использованием ключевого слова new
:
function Bar() {
this.a = 10;
console.log(this == Bar); // prints false
}
var bar = new Bar();
console.log(bar.a); // prints 10
Функция, которая предназначенавызов с ключевым словом new
называется «функцией конструктора».Object
и Function
оба являются примерами функций конструктора, поэтому их имена начинаются с заглавной буквы (соглашение в JavaScript).
Когда вы создаете объект с помощью функции конструктора, свойство prototype
этой функции используется в качестве прототипа (доступно через __proto__
) созданного объекта.
console.log(bar.constructor == Bar) // prints true
console.log(bar.__proto__ == Bar.prototype) // prints true
this
также используется для других целей, но это широкий вопрос и выход за рамки этого вопроса.