Объект и функция довольно запутывают
Object instanceof Object
true
Object instanceof Function
true
Function instanceof Object
true
Function instanceof Function
true
поэтому, если функция является объектом, а объект - это функция, как получилось
Function === Object
и Function == Object
являются ложными?
Я понимаю, что проверка экземпляра объекта - это не то же самое, что сравнение. Итак, вопрос здесь в том, что размытость в том случае, если два объекта (которые на самом деле являются типами) являются экземплярами друг друга, не должны ли типы быть одинаковыми?
Примечание. Объект не является экземпляром Number или Array только экземпляром Function.
Ответы
Ответ 1
От Прототипное наследование JavaScript:
Довольно все, в JavaScript, наследуется от Object. Мы могли бы сказать этот объект является супер-классом или, лучше, супер-конструктором, каждая переменная и что все является экземпляром объекта. Объект конструктор - это функция, но функция является экземпляром объекта. Это означает, что эти утверждения всегда верны:
(Object instanceof Function) === (Function instanceof Object)
Вышеприведенный пример - true, потому что Object является конструктором, а конструктор в JavaScript всегда является функцией. В то же время, каждая функция имеет свой собственный прототип, и прототип всегда начинает наследование с Object.prototype. Функция конструктор, является самой функцией, а прототип функции - функция() {};
(Function.prototype instanceof Object) === (function(){} instanceof Object)
Ответ 2
Все является Object
в JavaScript, потому что JavaScript является объектно-ориентированным языком. Function
является экземпляром Object
, потому что все является экземпляром Object
. Достаточно просто. Однако объекты, которые инициализируют другие объекты (конструкторы), также являются Function
в JavaScript, поэтому для Object
имеет смысл также быть Function
.
Подумайте об этом:
var obj = new Object();
Object
в этом случае используется как Function
, не так ли? Итак, теоретически Object
должен быть объектом самого низкого уровня на языке, JavaScript не может функционировать без Function
(pun!), Поэтому вам нужно, чтобы оба были на одном уровне. Object
должен быть экземпляром Function
, потому что это конструктор, и ему нужно создать больше экземпляров самого себя.
function FooBar() {}
Класс FooBar
выше - это экземпляр как Object
, так и Function
, потому что он оба. Такая же логика применяется к встроенным объектам Object
и Function
; они являются экземплярами обоих.
Фью, сбив с толку. Это имело какой-то смысл?
Ответ 3
Я думаю, что это больше связано с уникальным способом определения объектов. Вы не определяете тип в javascript, вы определяете конструктор. Но вы также не определяете конструктор как конструктор, это просто функция.
Затем вы можете ссылаться на типы по имени своего конструктора.... который является просто функцией.
function Tiger(){ //function, or object?
}
function Apple(){ //function, or object?
}
Оба могут быть объектами или, возможно, просто функциями. Это определит только то, как вы их используете. Так что имеет смысл, что на низком уровне объекты - это функции, а функции - объекты, но все еще есть разница, правильно?
Ответ 4
В Javascript нет таких вещей, как классы. Оператор instanceof
вызывается функциями.
Object
- это функция-конструктор для объектов объекта (да, это официальный термин), а Function
- это функция-конструктор для объектов-функций.
Итак, когда вы вызываете Function instanceof Object
, он возвращает true
, потому что Function
- это функция и, следовательно, объект и т.д. Это не означает, что типы одинаковы, потому что Object и Function имеют разные прототипы
Object.prototype
^
| inherits from
| instance
Function.prototype <------- Object, Function
Ответ 5
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 функцией?
Ответ 6
Предположим, что:
< ----: ссылки на (через .__proto__
)
< -: унаследовал свойство (через .
)
Тогда:
Function.prototype < ---- {Object, Function}
Объект < ---- Function.prototype
Object.prototype < - Object
console.log(Object.prototype.constructor === Object); // true!
Object.prototype
имеет ссылку не на что-либо; он не имеет свойства __proto__
.
Ответ 7
Оператор экземпляра указывает, является ли первый аргумент данного типа. Это говорит
A instanceof B
возвращает true, если A является экземпляром типа B.
Операторы == и === являются операторами сравнения, с другой стороны. Они сравнивают значения для равенства.
Например, вы можете сказать, что jack instanceof Boy прав, но могли бы вы сказать, что Джек == мальчик? Нет.