Прежде всего объекты JavaScript наследуют от других объектов, а не от конструкторских функций. Следовательно, утверждение «Но удивительно, что это не экземпляр объекта Array» неверен.
Скажем у вас есть объект, называемый rectangle
следующим образом:
var rectangle = {
height: 5,
width: 10
};
rectangle.area = function() {
return this.width * this.height;
};
Теперь я могу вычислить площадь этого прямоугольника путем вызова метода rectangle.area
. Однако скажу, что я хотел создать новый прямоугольник с разными width
и height
. Это то, что я хотел бы сделать:
var rectangle2 = Object.create(rectangle);
rectangle2.height = 8;
rectangle2.width = 20;
alert(rectangle2.area());
Здесь объект rectangle2
наследует от объекта rectangle
. Таким образом, вы видите, что объекты фактически наследуются от других объектов, а не от конструкторских функций. Прочитайте следующую нить для более подробной информации:
Questions regarding prototype function
Если перед вызовом функции с new
ключевым словом JavaScript создает новый объект, который наследует от prototype
функции. Следовательно, экземпляр фактически наследуется от prototype
.
Объект a
наследует только от объекта b
если объект b
находится в цепи прототипов объекта a
. Именно по этой причине у нас есть метод isPrototypeOf
.
Следующая вещь, чтобы помнить, что оператор instanceof
самом деле не означает ничего. Он может быть реализован в JavaScript следующим образом:
function instanceOf(obj, func) {
return Object.prototype.isPrototypeOf.call(func.prototype, obj);
}
Таким образом, как вы можете ясно видеть объект квалифицируется как «экземпляр» функции, только если он наследует от prototype
этой функции.
Именно поэтому Array.prototype instanceof Array
возвращает false
- объект не может наследовать сам.
Для получения дополнительной информации о том, как instanceof
оператор работает на прочитайте следующую тему:
JavaScript inheritance and the constructor property
Наконец length
свойство массива всегда один больше, чем наибольший числовой индекс из массив. Например:
var a = [];
alert(a.length); // 0
a[99999] = null;
alert(a.length); // 100000
Вот почему Array.prototype.length
является 0
- Array.prototype
не имеет цифровых клавиш. Однако, если присвоить ему числовой ключ, то length
свойство изменится соответствующим образом:
Array.prototype[99999] = null;
alert(Array.prototype.length); // 100000
То же самое относится и к x
- свойства "a"
и "b"
не являются числовыми. Следовательно, они не влияют на массив length
.
BTW, если вы заинтересованы в прототипном наследовании, то вы должны читать мой блог на Why Prototypal Inheritance Matters.
Ну, на самом деле вы первый большой массив x, и вы устанавливаете свойства для x, и это делает объект объектом Object.keys (x) –
Это случай массива против объекта. Похоже, вы хотите использовать объект здесь. – elclanrs
'var x = {};', '[]' это массив, он не принимает именованные ключи, только числовые (индексы) - тогда, чтобы подсчитать количество ключей, вы можете сделать, как предложил @jurka! –