В данном примере использовались конструкторы соответствующих типов. Но и экземпляры этих типов также наследуются от Object:
['foo', 'bar'] instanceof Object; // (Array literal)
//-> true
/.*/ instanceof Object; // (RegExp literal)
//-> true
new Date instanceof Object;
//-> true
Мы подошли к одной особенности JavaScript. Все "примитивы" в JavaScript, такие как строки, числа и логические переменные, являются также объектами. И обрабатываются, соответственно, в зависимости от контекста.
"foo" instanceof Object; //-> false
new String("foo") instanceof Object; //-> true
5 instanceof Object; //-> false
new Number(5) instanceof Object; //-> true
true instanceof Object; //-> false
new Boolean( true ) instanceof Object; //-> true
Это может быть весьма полезным. Примитивы передаются в функцию по значению ( а не по ссылке), но также они могут использовать объектно-ориентированные возможности JavaScript (методы экземпляра, локальная область видимости, и т.д.).
Хотя JavaScript несомненно является объектно-ориентированным, все же это не тот вид ООП , к которому Вы возможно привыкли. Строго говоря, в JavaScript нет понятия "class" — вместо того, чтобы выделить абстрактное определение объекта, можно просто сделать копию существующего объекта. Запомните следующее:
Array instanceof Object; //-> true
new Array instanceof Object; //-> true
Нет никакого технического различия между типом Array и объектами Array. Как в одном, так и в другом случае можно выполнять одни и те же действия.
Поскольку нет никаких классов, наследование в JavaScript основано на понятии прототипа. У каждого объекта есть свое собственное свойство prototype, которое служит шаблоном для любых новых экземпляров (копии), сделанные с этого объекта.
5