Джон прав. Вот способ это исправить. Вместо того, чтобы устанавливать StrangeArray.prototype в Array.prototype, это позволит вам установить StrangeArray.prototype в новый экземпляр Array, чтобы он наследовал свойства Array.prototype (без вызова конструктора Array).
Object.prototype.inherit = function(baseConstructor) {
var tmp = Function();
tmp.prototype = baseConstructor.prototype;
this.prototype = new tmp();
this.prototype.constructor = this;
};
Edit:
this.prototype = new baseConstructor();
работает в этом примере, но не подходит для более сложных программ. Если базовый конструктор выполняет некоторую инициализацию, такую как создание элементов DOM, увеличение счетчика или подключение к серверу, тогда вся эта инициализация будет выполняться при загрузке сценария, а не при создании экземпляра дочернего объекта.
Другим способом решения этой проблемы является различие в конструкторе, вызывается ли оно для наследования (для присвоения прототипу) или просто для создания экземпляра, а затем не выполнять инициализацию, если оно вызывается для наследования. Но я предпочитаю просто не вызывать конструктор при наследовании и поэтому использовать пустую функцию для конструктора при наследовании.
Я не очень хорош в объяснении этого материала. Я рекомендую сайт Крокфорда, а также эти две статьи о наследовании Javascript .