with выпиплили из стандарта, как известно. Я вот тут задумался, чем бы ее заменить. И вот, родил такую хрень:
proto={b: 2, c: 3}
ob={a: 1, b: 2, __proto__: proto}
reWrite=function(ob, newValues){
for (var name in newValues){
if(!ob) return
if(ob.hasOwnProperty(name)){ob[name]=newValues[name]; delete newValues[name]; reWrite(ob.__proto__, newValues)}
reWrite(ob.__proto__, newValues)
}
}
reWrite(ob, {b: 20, c: 30})
console.log(ob) // { a: 1, b: 20 }
console.log(proto) // { b: 2, c: 30 }
object.property.longnameOfObject.foo=1
object.property.longnameOfObject.bar=2
К тому же, она не срет в глобал (хотя легко можно сделать чтобы срала)
Взлетит?
PS хотя, да, __proto__, тоже выпиливается, но обещают get(set)PrototypeOf, и можно использовать constructor.prototype, если договорится, что мы его не изменяем.
UPD Прошу прощения, для имитации функционала with достаточно вообще, вот такого кода
proto={b: 2, c: 3}
ob={a: 1, b: 2, __proto__: proto}
reWrite2=function(ob, newValues){
for(var name in newValues){
if(ob[name]){ob[name]=newValues[name]}
}
}
reWrite2(ob, {b: 20, c: 30})
//with(ob){
//b=20; c=30
//}
console.log(ob) // { a: 1, b: 20, c: 30}
console.log(proto) // { b: 2, c: 3 }
А то что я написал, это целый комбайн для изменения прототипов:) Но оно работает не аналогично with