Javascript: как создать новый экземпляр объекта-прототипа?

Прототип — это объект, который передается по наследству? всеми экземплярами объекта, например child в моем следующем примере.

Это должен быть экземпляр родителя, иначе прототип родителя не будет унаследован?

В этом случае цель состоит в том, чтобы создать отдельный массив, наследуемый от родителя, для каждого экземпляра дочернего элемента.

Я не уверен, как именно этого добиться. Я знаю о extend.

Является ли метод расширения простым копированием прототипов в новый объект и применением к нему новых методов?

Мой пример кода + jsfiddle:

function parent(){
}

parent.prototype.arr = []; 
parent.prototype.add = function(item){
    this.arr.push(item);
}
parent.prototype.show = function(){

    for(var i = 0; i < this.arr.length; ++i){
        $('body').append(this.arr[i]);
    }
}


function child(childname){
    this.add(childname); 
}
child.prototype = new parent();


var child1 = new child('child1');
var child2 = new child('child2');

child2.show();//this should only show child2? 

person alotofquestions    schedule 31.01.2014    source источник
comment
comment
parent.prototype.arr = []; Это всегда неправильно; у вас есть только один экземпляр.   -  person SLaks    schedule 31.01.2014
comment
child.prototype = new parent(); ничего полезного не делает. Создание общедоступного свойства prototype объекта полностью отличается от частного [[Prototype]] унаследовано от его конструктора.   -  person RobG    schedule 31.01.2014
comment
aaditmshah.github.io/why-prototypal-inheritance-matters   -  person Aadit M Shah    schedule 31.01.2014
comment
У вас есть много ссылок и документации для чтения. Я создал следующий ответ, предполагая, что вы еще НЕ знаете, как работает прототип: " title="написание прототипа наследования"> stackoverflow.com/questions/16063394/   -  person HMR    schedule 31.01.2014


Ответы (1)


Чтобы дать каждому экземпляру собственный массив, не используйте прототип для хранения массива, поскольку он является общим для всех экземпляров. Вы можете инициализировать новый массив в конструкторе родителя, а затем в дочернем классе убедитесь, что вы вызываете конструктор родителя:

function parent(){
    this.arr = [];
}

function child() {
    parent.call(this);   // call parent constructor
}
child.prototype =  Object.create(parent.prototype);
child.prototype.constructor = child;

Теперь у каждого родительского объекта будет своя копия массива, включая те, которые являются частью дочерних объектов-потомков.

Подробное объяснение см. в этой статье MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

person jfriend00    schedule 31.01.2014