LINUX.ORG.RU

Частичная замена with

 


0

2

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



Последнее исправление: terminator-101 (всего исправлений: 4)

var v = object.property.longnameOfObject;
v.foo = 1;
v.bar = 2;
(function(arg) {
    console.log("Hello " + arg.foo + " " + arg.bar);
}(object.property.longnameOfObject));
anonymous
()
Ответ на: комментарий от terminator-101

фуфло — это ковырять прототипы за пределами constructor.prototype

anonymous
()

полноценный with можно любой код выполнять, а твой мап позволяет только поля поменять

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Да, а я и не говорил, что он полноценный. Может на досуге подумаю, как реализовать полноценный, пока такой, не все сразу:)

Вообще, первая версия, работает не как with, это я об*бался, но она интересная. Она меняет поля не так как with, она меняет их именно там, где они определены. То есть, если какой то объект из цепочки прототипов содержит указанное поле, то это поле будет перезаписано именно в нем, а не в объекте к которому мы обращаемся. Если от него наследуют другие объекты, они будут наследовать именно обновленное поле. Так можно одним махом переопределить свойства целой «семьи», обратившись к любому из членов. Как если бы мы, например, имели цепочку дед - отец - сын - внук, и все они брюнеты, то сделав reWrite(сын, {волосы: белые}), они станут все блондинами.

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

пробовал играть с классами, собирая их из кусочков, правда в статике препроцессором. Всё это круто, но возникает некая анархия, непонятно что и зачем делать дальше. Неплохо бы к фиче сразу придумывать обоснование, зачем оно может быть нужно. Может быть, это даже труднее, чем запилить саму фичу :3 Вот зачем делать деда брюнетом путем изменения внука?

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Не, деда не нужно, это пример просто, в смысле, как_оно_работает. Попробую придумать реальный пример, че то заклинило, но чую, что эт можно использовать. Просто непривычно такие абстракции строить, поэтому ступор. Если придумаю что стоящее, отпишусь тут обязательно, щас голова не варит.:)

terminator-101
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.