Объект и функция довольно запутаны - PullRequest
13 голосов
/ 05 января 2010
Object instanceof Object
true
Object instanceof Function
true
Function instanceof Object
true
Function instanceof Function
true

поэтому, если функция является объектом, а объект является функцией, то как получается

Function === Object и Function == Object ложны?

Я понимаю, что проверка экземпляра объекта - это не то же самое, что сравнение. Таким образом, здесь возникает вопрос нечеткости в том случае, если два объекта (которые на самом деле являются типами) являются экземплярами друг друга, не должны ли типы быть одинаковыми?

Примечание. Объект не является экземпляром Number или Array, а просто экземпляром Function.

Ответы [ 7 ]

17 голосов
/ 05 января 2010

От Наследование прототипов JavaScript :

Совсем все в JavaScript наследуется от Object. Мы могли бы сказать этот объект является суперклассом, или, что лучше, супер-конструктором каждая переменная и все это является экземпляром объекта. Предмет Конструктор - это функция, но функция - это экземпляр объекта. Это означает, что эти утверждения всегда верны:

(Object <a href="http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Operators:Special_Operators:instanceof_Operator" rel="nofollow noreferrer">instanceof</a> Function) === (Function instanceof Object)

Приведенный выше пример верен, поскольку Object является конструктором, а конструктор в JavaScript всегда является функцией. В то же время, каждая функция имеет свой собственный прототип, и прототип всегда начинает свое наследование от Object.prototype. Функция конструктор, сама функция, а прототип функции функция () {};

(Function.prototype <a href="http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Operators:Special_Operators:instanceof_Operator" rel="nofollow noreferrer">instanceof</a> Object) <a href="http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Operators:Comparison_Operators" rel="nofollow noreferrer">===</a> (function(){} instanceof Object)

5 голосов
/ 05 января 2010

В JavaScript все равно Object, потому что JavaScript является объектно-ориентированным языком. Function является экземпляром Object, потому что все является экземпляром Object. Достаточно просто. Однако объекты, которые инициализируют другие объекты (конструкторы), также являются Function s в JavaScript, поэтому было бы разумно, чтобы Object также был Function.

Подумайте об этом:

var obj = new Object();

Object в данном случае используется как Function, не так ли? Поэтому, хотя теоретически Object должен быть объектом самого низкого уровня в языке, JavaScript не может функционировать без Function s (каламбур!), Поэтому вам нужно, чтобы оба были на одном уровне. Object должен быть экземпляром Function, потому что это конструктор и ему нужно создавать больше экземпляров самого себя.

function FooBar() {}

Класс FooBar выше является экземпляром Object и Function, потому что это оба. Та же логика применима ко встроенным объектам Object и Function; это примеры обоих.

Фу, сбивает с толку. Это имело смысл?

4 голосов
/ 05 января 2010

Я думаю, что это больше из-за уникального способа определения объектов. Вы не определяете тип в javascript, вы определяете конструктор. Но вы также не определяете конструктор как конструктор, это просто функция.

Затем вы можете ссылаться на типы по имени их конструктора .... который является просто функцией.

function Tiger(){ //function, or object?
}

function Apple(){ //function, or object?
}

Оба могут быть объектами или просто функциями. Это определит только то, как вы их используете. Так что вроде имеет смысл, что на низком уровне объекты - это функции, а функции - это объекты, но есть и разница, верно?

1 голос
/ 08 сентября 2014

В Javascript нет такой вещи, как классы. Оператор instanceof вызывается для функций.

Object - функция конструктора для «Объектных объектов» (да, это официальный термин), а Function - функция конструктора для «Функциональных объектов».

Итак, когда вы вызываете Function instanceof Object, он возвращает true, потому что Function - это функция, и, следовательно, объект, и т. Д. Это не означает, что типы одинаковы, потому что Object и Function имеют разные прототипы. :

Object.prototype
   ^
   | inherits from
   |                instance
Function.prototype  <-------  Object, Function
0 голосов
/ 10 декабря 2015

Пусть

<----: ссылки на (через <code>.__proto__)

<-: унаследовал свойство (через <code>.)

Тогда

Function.prototype <---- {Объект, Функция} </strong>

Объект <---- Function.prototype </strong>

Object.prototype <- Object </strong>

console.log(Object.prototype.constructor === Object); // true!

Object.prototype делает не ссылку на что-либо; у него нет свойства __proto__.

0 голосов
/ 18 августа 2011
 javascript:alert([ window.navigator.userAgent, Object ].join("\n\n") )

показывает

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 
    Ubuntu/10.04 (lucid) Firefox/3.6.3

function Object() {
    [native code]
}

ссылка: Является ли каждый объект JavaScript функцией?

0 голосов
/ 05 января 2010

Оператор instanceof указывает, имеет ли первый аргумент заданный тип. Это говорит

 A instanceof B

возвращает true, если A является экземпляром типа B.

С другой стороны, операторы == и === являются операторами сравнения. Они сравнивают значения на равенство.

Например, вы можете сказать, что jack instanceof Boy - правда, но вы бы сказали, что jack == boy? Нет.

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