ssadfaf,
все так и должно работать, так как это св-во наследуется. чтобы работало по другому, надо создать свое свойство в объекте, которое затрет наследуемое
extend=function(src, trg){for(var i in src) trg[i]=src[i]}
function Db(ob){
extend(ob, this)
return this
}
Db.prototype.arr=["foo"]
dbs={
list: [
{}
]
}
for(var i in dbs.list) dbs.list[i]=new Db(dbs.list[i])
dbs.list[0].arr.push("bar")
console.log(Db.prototype.arr, dbs.list[0].arr)
dbs.list[0].arr=[]
dbs.list[0].arr.push("baz")
console.log(Db.prototype.arr, dbs.list[0].arr)
// [ 'foo', 'bar' ] [ 'foo', 'bar' ]
// [ 'foo', 'bar' ] [ 'baz' ]
В Вашем изначальном случае с __proto__ в подобной ситуации тоже менялось свойство прототипа а не самого объекта, просто у каждого объекта, в Вашем случае, был свой "личный" прототип, что неверно, с точки зрения проектирования.
item.__proto__ = new MyDb // это неверно.
// правильно вот так
parent=new MyDb
item.__proto__=parent
и тогда бы было то же самое. Ваш Вариант не имеет смысла, с тем же успехом можно было тупо экстендить каждый item
extend=function(src, trg){for(var i in src) if(!trg[i]) trg[i]=src[i]}
pattern={foo: 1, bar: 2, baz: 3}
dbs={
list: [
{foo: 10},
{foo: 100, bar: 10}
]
}
for(var i=0; i<dbs.list.length; i++){
extend(pattern, dbs.list[i])
}
for(var i=0; i<dbs.list.length; i++){
console.log(dbs.list[i])
}
// { foo: 10, bar: 2, baz: 3 }
// { foo: 100, bar: 10, baz: 3 }
, а нужно делегирование (если нужно конечно).