Каждый объект - это функция, а каждая функция - объект. Что является правильным? - PullRequest
43 голосов
/ 10 августа 2010

Я читал эту ссылку JavaScript_syntax

Это кажется цикличным - каждая функция является объектом, а каждый объект сам является функцией.Какой атом?Может кто-нибудь объяснить лучше?

Ответы [ 13 ]

52 голосов
/ 10 августа 2010
  1. Все, что не является примитивным типом (undefined, null, number, string, boolean), является объектом (или экземпляром) в JavaScript. Это означает, что function наследуется от object.

  2. Экземпляры объектов могут содержать больше экземпляров, которые могут быть функциями. Это то, что мы называем «методом» (поскольку он имеет автоматическую переменную this).

  3. Поскольку вы не можете "вызывать" каждый экземпляр объекта, не каждый объект является функцией.

15 голосов
/ 26 июня 2015

Я думаю, что это понятие часто неправильно понимают.

Утилита для визуализации отношений типов JS http://jstype.herokuapp.com/#/home

Типы данных Javascript

  1. Примитивные типы - числа,строки, логические значения, неопределенные и неопределенные.
  2. Все непримитивные типы: object :

var foo = { }; 
var foo = [1, 2, 3]; 
var foo = function abc() { return "hello world"; }; 
var foo = new Number(30); 
var foo = new String("Hello World"); 
var foo = new Boolean(true); 
var foo = new RegExp(/[foo]+/);

// All 'foo` are object. 

Всем примитивным типам соответствует Функция конструктора wiz.Array, Number, String, Boolean, RegExp.Поскольку все функции являются объектами, они также являются объектами.Таким образом, мы можем назвать их объектами функции конструктора.

Большая часть не примитивного типа обладает свойством prototype, где живут все унаследованные вещи.У Math нет прототипа.

Все объекты наследуются от Object.prototype, который наследуется от null.
object <- Object.prototype <- null

Все собственные функции наследуются от Function.prototype, который наследуется от Object.prototype.
function <- Function.prototype <- Object.prototype <- null

Массивы наследуются от Array.prototype, который наследуется от Object.prototype.
array <- Array.prototype <- Object.prototype <- null

Необходимо прочитать MDN: цепочка наследования и прототипа
Чтобы запутаться Stackoverflow: прототип в JavaScript
Переполнение стека: объяснение прототипа функции

8 голосов
/ 10 августа 2010

Каждая функция является объектом.Объекты могут содержать функции (методы), но объект не обязательно является функцией.

6 голосов
/ 10 августа 2010

Также Function всегда является свойством object.

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

.. fredrik

3 голосов
/ 10 августа 2010

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

Вы часто будете видеть методы, объявленные так:

var myFunc = function(foo, bar) {
    ...
};

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

. Это основа наиболее важной функции в javascript, закрытие .

3 голосов
/ 10 августа 2010

Было бы лучше сказать, что в JavaScript все можно трактовать как объект, который включает как примитивные типы, так и типы функций; что делает интерпретатор JavaScript, так это то, что он автоматически продвигает ваши примитивы и функции к их типам обертки объектов при взаимодействии с ними.

Существует также объект Function, ряд эквивалентных оболочек для других примитивов в JavaScript, что означает, что вы даже можете вызывать методы в экземплярах функций, например:

myFunction(someArg).call(this)

Как говорится, не каждый объект на самом деле является функцией.

1 голос
/ 18 декабря 2017

Объект - это абстрактные данные, данные классу, и этот класс назначается объекту.Объект может иметь свойства, а свойства могут содержать значения и функции.Или просто для облегчения понимания, вы можете сказать, что все, что не является примитивным типом данных (число, строка, логический, unll и undefined), может быть классифицировано как объект.

1 голос
/ 15 августа 2017

javascript все это хеш-таблица. Райан Даль сказал это в одном из своих разговоров. вот что такое JSON; определение хеш-таблицы Вот почему вы можете получить доступ к объекту, используя запись массива или запись свойства объекта. значение хеш-таблицы также может быть функцией, которая является хеш-таблицей. или скорее ассоциативный массив введите Object в консоли и получите {[native code]}, который является хеш-таблицей

1 голос
/ 01 марта 2017

Только для дополнения к ответу Аарона Дигуллы. В javascript не каждый объект является функцией. Но Object, Array, String и многие другие встроенные объекты являются функциями, которые используются с оператором new для создания объекта. Я думаю, это то, что смутило большинство людей.

1 голос
/ 11 августа 2011

Цитирование из Работа с объектами - MDN Docs
section Использование инициализаторов объектов последний абзац:

"В JavaScript 1.1 и более ранних версиях вы не можете использовать инициализаторы объектов. Вы можете создавать объекты только с использованием их функций конструктора или с помощью функции, предоставленной другим объектом для этой цели. См. Использование функции конструктора . «

означало, что все объекты БЫЛИ функционируют! В частности, при оценке, экземплярах или экземплярах функций.

Буквально, ВСЕ объекты этого винтажа были созданы синтаксически с такими конструкциями, как:

 "newobj = new constructFunctor(arg1,arg2){this.prop1=arg1 /* etc */}(val1,val2)"

И в строке, которая делает объект "newobj", есть слово "constructFunctor", имя функции. Заявление намеренно процитировано, чтобы продемонстрировать тот факт, что оно должно быть выполнено eval(). До выполнения «newobj» «приравнивается» к функции, потому что оператор ДОЛЖЕН иметь единицу и «равен» единице в силу буквального существования «constructFunctor», чтобы определять значение newobj при выполнении. Цитирование, а не, очень преднамеренное для разъяснения этой абстракции. Однако, поскольку JavaScript имеет функцию eval, эта абстракция фактически намеренно включена в язык JavaScript.

Наследие этого по-прежнему является фундаментальным для JavaScript, хотя некоторые синтаксические сокращения были добавлены как «инициализаторы объектов» с использованием сокращенной записи, такой как: «no={}». Тот факт, что приведенный выше абзац все еще присутствует в текущей документации, имеет значение по указанным причинам.

Кроме того, JavaScript также иллюстрирует фундаментальные парадигмы функционального программирования. Это определяет все как функцию, используя абстракции теории рекурсивных функций и лямбда-исчисления! Например, 0 (), 1 (), 2 (), ... - постоянные ненарные функции, более известные как 0,1,2,3, ...

JavaScript полностью соответствует подходу функционального стиля программирования, а не общему OOPS (каламбур объектно-ориентированного стиля программирования).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...