Является ли `Object` функцией в JavaScript? - PullRequest
0 голосов
/ 25 февраля 2019

Рассмотрим эту функцию:

function Foo(){
    var a = "3";
};

Согласно __ proto__ VS.прототип в JavaScript ,

Foo.__proto__ = Function.prototype
Function.prototype.__proto__ = Object.prototype

Я понял эту часть, но если я сделаю это в консоли Google Chrome:

Object.__proto__
output: ƒ () { /* native code */ }

Function.__proto__
output: ƒ () { /* native code */ }

Q1: Почему они указывают на функцию?Что на самом деле являются Function и Object и чем они отличаются друг от друга, потому что Объект на самом деле является функцией ?:

typeof Object
"function"

Q2: Если в JavaScript все является объектом, то почему Object является функцией?Кроме того, как функция на самом деле реализована внутри JavaScript?Что происходит с переменными, объявленными внутри функции?Компилятор JavaScript преобразовывает функцию в объект?

Извините, если я упускаю что-то очевидное.Я действительно смущен тем, как функция и объект реализованы в JavaScript.

Ответы [ 7 ]

0 голосов
/ 25 февраля 2019

Да, Объект имеет тип функции.Это реализация класса / функции, которая при вызове с новым (new Object()) приведет к объекту с выделенной памятью.

0 голосов
/ 26 февраля 2019

Справочник по ECMAScript очень хорош для ответов на такие вопросы.

Следовательно, чтобы ответитьВаш вопрос: Foo может быть не чем иным, как объектом (потому что все остальное в меню является базовым типом значения).Следовательно, Foo() - это специальный синтаксис, который просто вызывает внутренний метод Call этого объекта.Но Foo сам по себе является объектом насквозь, вы можете делать с ним все остальное, что можете делать с любым другим объектом, включая установку на него произвольных атрибутов.

Наличие метода, определенного для объекта, просто означает, чтоесть атрибут с этим именем, и этот атрибут ссылается на объект, который оказывается «функциональным объектом».

Что-то, что может быть использовано в качестве конструктора, опять же, просто объект, который имеетConstruct внутренний метод и синтаксический сахар для его вызова.

Как вы знаете, в JavaScript нет классов, это объектно-ориентированный язык на основе прототипов (это как object * 1032)* -ориентирован как вы можете получить, в нем буквально больше ничего нет).Таким образом, любой «прототип» - это просто связь между объектами.Метод конструктора (как объяснено в приведенной выше ссылке) просто вызывает метод конструктора с объектом, для которого он был вызван (т.е. что-то вроде String) в качестве аргумента, точно так же, как язык будет вызывать Call с this будучи объектом, к которому был вызван метод.

0 голосов
/ 25 февраля 2019

Вы, кажется, запутались между «объектом» (структура данных) и 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 также используется для других целей, но это широкий вопрос и выход за рамки этого вопроса.

0 голосов
/ 25 февраля 2019

Функция и Объект являются функциями-конструкторами, которые могут использоваться для создания функции и объекта соответственно, поэтому typeof Function возвращает function.

О том, как функции и объекты связаны вjavascript, рассмотрим следующие моменты:

  1. Все не примитивные типы являются объектами в JavaScript.
  2. Все объекты прямо или косвенно наследуются от Object.prototype (если прототип не изменен явно с помощью setPrototypeOf).
  3. Все встроенные функции наследуются от Function.prototype, который наследуется от Object.prototype, поэтому это означает, что функция косвенно наследует от Object.prototype, поскольку функции обрабатываются как объекты JavaScript.
  4. Причинафункции рассматриваются как объекты, потому что они могут быть переданы в качестве параметров другим функциям и могут быть возвращены из функций, то есть функций более высокого порядка (мощная особенность javascript).
  5. Функция может быть вызвана с использованием() оператор, потому что JaДвижок vaScript знает, что он объявлен с использованием ключевого слова функции и имеет исполняемый код.Поэтому, когда бы он ни вызывался, движок JavaScript создает новый контекст выполнения, устанавливает привязку this и затем выполняет функцию.Ничего из этого не происходит, когда вы пытаетесь вызвать объект, вместо этого выдается ошибка, т. Е. «Это не функция».

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

  6. Поскольку функция рассматривается как объект JavaScript, мы можем добавлять к ней свойства, создавать из нее новые объекты.
  7. Объект типа функции нельзя вызвать с помощью (), поскольку он не имеет исполняемого кода и не объявлен с использованием ключевого слова function.Вместо этого он объявляется с использованием new Object() или нотации объекта и содержит методы и свойства.

Я надеюсь, что он устраняет оба вопроса.

0 голосов
/ 25 февраля 2019

Принципиально

Functions имеет некоторый код, который может быть выполнен.Object - это те, которые содержат данные.

Для класса Point, имеющего x и y.

class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
    isOrigin() { return x == 0 && y == 0; }
}
let p = new Point();

Ответ 1

При этом p - это object, который содержит данные или другие функции.

p.isOrigin - это функция.

Аналогично, класс Point сам по себе является function, которыйкогда работает производит p.Вот почему все классы, такие как Object и Functions, functions точнее constructor functions.

Ответ 2

Если все является объектомв JavaScript, тогда почему Object является функцией?

То же, что ответ 1.

Кроме того, как на самом деле реализована функция в JavaScript?

Различные движки JavaScript будут иметь разные реализации.У них есть спецификации, которым они должны следовать.

Что происходит с переменными, объявленными внутри функции?

Не по теме.Каждый function работает с областью, которая содержит все данные для этих функций.

Преобразуется ли функция в объект компилятором JavaScript?

Не уверены, чтоты спрашиваешь.

0 голосов
/ 25 февраля 2019

Object - это функция конструктора всех объектов.Итак, typeof Object==="function"

Вот фрагмент для визуализации:

console.log(typeof Object)            //function (which is an object)
var object=new Object()               //An instance of Object 'class'
console.log(typeof object)            //object
console.log(object instanceof Object) //true, because object is created by Object()

Function - это функция конструктора всех функций (включая себя ...)

Таким образом, хотя не все является функцией , но большая часть собственных идентификаторов в верхнем регистре относится к функции конструктора.

0 голосов
/ 25 февраля 2019

Q1: почему они указывают на функцию?

A1: потому что они являются функциями.Function и Object являются просто функциями конструктора.

- это Function object.объект является Object object.

Q2: если в JavaScript все является объектом, то почему Object является функцией?

A2: потому что Objectэто просто функция конструктора.

typeof Object
// 'function'
typeof new Object()
// 'object'

И функция является экземпляром Function, поэтому функция становится объектом.

(function(){}) instanceof Function
// true
...