Я хочу создать объект, который наследуется от другого объекта. Создавая потомка, я хочу поместить некоторые элементы в унаследованный массив без изменения объекта parentobject.
Скажем, у меня есть объект с именем basket:
function Basket(){
}
Затем я заполняю его следующим образом:
Basket.prototype {
“price”: 5,
“contents” : [“apple”, “orange”, “grape”]
}
Теперь я хочу расширить это. Я хочу добавить некоторые свойства и изменить некоторые. Я сделал это:
function BigBasket(){
this.price = 6; // change a property. This goes well, when an instance is created, price is still 5 in prototype and also in instances of Basket and it is 6 in the instance that is created from this descendant.
this.greetingcard = “Congratulations” // add a property. Goes well
Теперь я хочу добавить элемент в свойство contents, но только в экземплярах-потомках.
Это идет не так:
this.contents.push(“banana”);
Кажется, что this.contents содержит ссылку на массив прототипа, поэтому, когда вы помещаете на него банан, это означает, что экземпляры как Bigbasket, так и Basketбанан в их содержании также. Поэтому я сначала сделал копию Basket.contents (родительского содержимого) следующим образом:
this.contents = Object.getPrototypeOf(this).contents.slice(); // seems __proto__ is deprecated, so using getPrototypeOf here and then pushed the banana:
this.contents.push(‘banana’);
}
Кажется, это работает, но так ли это? Я знаю, что массив также является объектом, поэтому я попробовал это:
this.contents = Object.create(Basket.prototype.contents);
this.contents.push('banana');
Это тоже работает и кажется более общим способом. Кроме того, в Chrome элемент, который был помещен последним, был свойством только потомка, а остальные элементы массива были свойствами прототипа. Мне кажется элегантным.
Тем не менее, это выглядит немного неуклюже для меня. Я делаю все это неправильно? Пытался выяснить, но не смог найти что-либо на тему массивов в расширении объектов. Есть ли способ сделать потомков, где все свойства копируются и на них не ссылаются при создании экземпляра?
Спасибо!