Проблема заключается в том, что ваш код пытается заменить встроенный в прототип (который сам по себе является массивом) с равниной объект, который имеет только свойства, которые вы назначаете. Вместо замены прототипа добавьте свойства к тому, который уже существует, например.
Array.prototype.third = function() {
console.log(a[3]);
}
Кроме того, поскольку вы создаете в массив перед заменой Array.prototype, это получить самый старый прототип, не новый (если новый добавляется совсем). Оба метода бросают ошибки, а не только показывают. Если вы измените прототип до, создав a, он «работает» в браузерах, которые позволяют перезаписывать встроенные прототипы. Он не будет работать в ECAMScript эд 3 (или, возможно, раньше) реализации или позже, где Array.prototype имеет атрибуты:
{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }
так что вы не можете заменить его, а сам объект имеет атрибуты:
{ [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }
, так что вы можете добавить свойства и перезаписать встроенные методы, если хотите.
Обратите внимание на то, что, как правило, предупреждают о распространении встроенных объектов, см. Extending builtin natives. Evil or not?.
Где код для справки? –
Пожалуйста, отправьте образец кода. – bfontaine
Это действительно плохо, потому что то, что вы делаете, заменяет _all_ methods на прототипе Array своим. Пожалуйста, не делайте этого. – Andy