Показать сообщение отдельно
  #9 (permalink)  
Старый 29.12.2014, 17:22
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

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 }

, а нужно делегирование (если нужно конечно).

Последний раз редактировалось krutoy, 29.12.2014 в 18:04.
Ответить с цитированием