익명
245
2017-04-27 06:30:08 작성 2017-04-27 09:21:35 수정됨
2
931

객체의 부모를 프로토타입 체인을 걸어버리는 로직을 만들기. 미치겠네요 ㅋㅋㅋㅋ


객체의 부모를 프로토타입 체인을 걸어버리는 로직을 만들려고하는데.. 미치겠네요. ㅋㅋ

기초가 부족해서 그런가..ㅠㅠ..

일단은 밑에  코드를 보시면 아시겠지만





var otp = {};
otp.obj_Aa = {};
otp.obj_Aa.obj_Aa_Ba = Object.create(otp.obj_Aa);
otp.obj_Aa.obj_Aa_Ba.obj_Aa_Ba_Ca = Object.create( otp.obj_Aa.obj_Aa_Ba);
otp.obj_Aa.obj_Aa_Ba.obj_Aa_Ba_Ca.obj_Aa_Ba_Ca_Da = Object.create(otp.obj_Aa.obj_Aa_Ba.obj_Aa_Ba_Ca);
otp.obj_Aa.obj_Aa_Ba.obj_Aa_Ba_Ca.obj_Aa_Ba_Ca_Db = Object.create(otp.obj_Aa.obj_Aa_Ba.obj_Aa_Ba_Ca);

otp.obj_Aa.obj_Aa_Ba.obj_Aa_Ba_Cb = Object.create( otp.obj_Aa.obj_Aa_Ba);
otp.obj_Aa.obj_Aa_Ba.obj_Aa_Ba_Cb.obj_Aa_Ba_Cb_Da = Object.create(otp.obj_Aa.obj_Aa_Ba.obj_Aa_Ba_Cb);
otp.obj_Aa.obj_Aa_Ba.obj_Aa_Ba_Cb.obj_Aa_Ba_Cb_Db = Object.create(otp.obj_Aa.obj_Aa_Ba.obj_Aa_Ba_Cb);

otp.obj_Aa.obj_Aa_Bb = Object.create(otp.obj_Aa);
otp.obj_Aa.obj_Aa_Bb.obj_Aa_Bb_Ca = Object.create( otp.obj_Aa.obj_Aa_Bb);
otp.obj_Aa.obj_Aa_Bb.obj_Aa_Bb_Ca.obj_Aa_Bb_Ca_Da = Object.create(otp.obj_Aa.obj_Aa_Bb.obj_Aa_Bb_Ca);
otp.obj_Aa.obj_Aa_Bb.obj_Aa_Bb_Ca.obj_Aa_Bb_Ca_Db = Object.create(otp.obj_Aa.obj_Aa_Bb.obj_Aa_Bb_Ca);

otp.obj_Aa.obj_Aa_Bb.obj_Aa_Bb_Cb = Object.create( otp.obj_Aa.obj_Aa_Bb);
otp.obj_Aa.obj_Aa_Bb.obj_Aa_Bb_Cb.obj_Aa_Bb_Cb_Da = Object.create(otp.obj_Aa.obj_Aa_Bb.obj_Aa_Bb_Cb);
otp.obj_Aa.obj_Aa_Bb.obj_Aa_Bb_Cb.obj_Aa_Bb_Cb_Db = Object.create(otp.obj_Aa.obj_Aa_Bb.obj_Aa_Bb_Cb);



otp.obj_Ab = Object.create(otp.obj_Aa);
otp.obj_Ab.obj_Ab_Ba = Object.create(otp.obj_Ab);
otp.obj_Ab.obj_Ab_Ba.obj_Ab_Ba_Ca = Object.create( otp.obj_Ab.obj_Ab_Ba);
otp.obj_Ab.obj_Ab_Ba.obj_Ab_Ba_Ca.obj_Ab_Ba_Ca_Da = Object.create(otp.obj_Ab.obj_Ab_Ba.obj_Ab_Ba_Ca);
otp.obj_Ab.obj_Ab_Ba.obj_Ab_Ba_Ca.obj_Ab_Ba_Ca_Db = Object.create(otp.obj_Ab.obj_Ab_Ba.obj_Ab_Ba_Ca);

otp.obj_Ab.obj_Ab_Ba.obj_Ab_Ba_Cb = Object.create( otp.obj_Ab.obj_Ab_Ba);
otp.obj_Ab.obj_Ab_Ba.obj_Ab_Ba_Cb.obj_Ab_Ba_Cb_Da = Object.create(otp.obj_Ab.obj_Ab_Ba.obj_Ab_Ba_Cb);
otp.obj_Ab.obj_Ab_Ba.obj_Ab_Ba_Cb.obj_Ab_Ba_Cb_Db = Object.create(otp.obj_Ab.obj_Ab_Ba.obj_Ab_Ba_Cb);

otp.obj_Ab.obj_Ab_Bb = Object.create(otp.obj_Ab);
otp.obj_Ab.obj_Ab_Bb.obj_Ab_Bb_Ca = Object.create( otp.obj_Ab.obj_Ab_Bb);
otp.obj_Ab.obj_Ab_Bb.obj_Ab_Bb_Ca.obj_Ab_Bb_Ca_Da = Object.create(otp.obj_Ab.obj_Ab_Bb.obj_Ab_Bb_Ca);
otp.obj_Ab.obj_Ab_Bb.obj_Ab_Bb_Ca.obj_Ab_Bb_Ca_Db = Object.create(otp.obj_Ab.obj_Ab_Bb.obj_Ab_Bb_Ca);

otp.obj_Ab.obj_Ab_Bb.obj_Ab_Bb_Cb = Object.create( otp.obj_Ab.obj_Ab_Bb);
otp.obj_Ab.obj_Ab_Bb.obj_Ab_Bb_Cb.obj_Ab_Bb_Cb_Da = Object.create(otp.obj_Ab.obj_Ab_Bb.obj_Ab_Bb_Cb);
otp.obj_Ab.obj_Ab_Bb.obj_Ab_Bb_Cb.obj_Ab_Bb_Cb_Db = Object.create(otp.obj_Ab.obj_Ab_Bb.obj_Ab_Bb_Cb);



otp.obj_Ac = Object.create(otp.obj_Ab);
otp.obj_Ac.obj_Ac_Ba = Object.create(otp.obj_Ac);
otp.obj_Ac.obj_Ac_Ba.obj_Ac_Ba_Ca = Object.create( otp.obj_Ac.obj_Ac_Ba);
otp.obj_Ac.obj_Ac_Ba.obj_Ac_Ba_Ca.obj_Ac_Ba_Ca_Da = Object.create(otp.obj_Ac.obj_Ac_Ba.obj_Ac_Ba_Ca);
otp.obj_Ac.obj_Ac_Ba.obj_Ac_Ba_Ca.obj_Ac_Ba_Ca_Db = Object.create(otp.obj_Ac.obj_Ac_Ba.obj_Ac_Ba_Ca);

otp.obj_Ac.obj_Ac_Ba.obj_Ac_Ba_Cb = Object.create( otp.obj_Ac.obj_Ac_Ba);
otp.obj_Ac.obj_Ac_Ba.obj_Ac_Ba_Cb.obj_Ac_Ba_Cb_Da = Object.create(otp.obj_Ac.obj_Ac_Ba.obj_Ac_Ba_Cb);
otp.obj_Ac.obj_Ac_Ba.obj_Ac_Ba_Cb.obj_Ac_Ba_Cb_Db = Object.create(otp.obj_Ac.obj_Ac_Ba.obj_Ac_Ba_Cb);

otp.obj_Ac.obj_Ac_Bb = Object.create(otp.obj_Ac);
otp.obj_Ac.obj_Ac_Bb.obj_Ac_Bb_Ca = Object.create( otp.obj_Ac.obj_Ac_Bb);
otp.obj_Ac.obj_Ac_Bb.obj_Ac_Bb_Ca.obj_Ac_Bb_Ca_Da = Object.create(otp.obj_Ac.obj_Ac_Bb.obj_Ac_Bb_Ca);
otp.obj_Ac.obj_Ac_Bb.obj_Ac_Bb_Ca.obj_Ac_Bb_Ca_Db = Object.create(otp.obj_Ac.obj_Ac_Bb.obj_Ac_Bb_Ca);

otp.obj_Ac.obj_Ac_Bb.obj_Ac_Bb_Cb = Object.create( otp.obj_Ac.obj_Ac_Bb);
otp.obj_Ac.obj_Ac_Bb.obj_Ac_Bb_Cb.obj_Ac_Bb_Cb_Da = Object.create(otp.obj_Ac.obj_Ac_Bb.obj_Ac_Bb_Cb);
otp.obj_Ac.obj_Ac_Bb.obj_Ac_Bb_Cb.obj_Ac_Bb_Cb_Db = Object.create(otp.obj_Ac.obj_Ac_Bb.obj_Ac_Bb_Cb);







obj의 바로 첫 레벨은 자신보다 먼저 생성된 객체에 체인을 걸고,

(이를chainX라 부르겠습니다.)


그 다음 레벨은 부터는 모두 자신의 부모로 체인을 걸어놓은

(이를chainY라 부르겠습니다.)


객체를 하나 만들고 싶습니다.


그런데 중요한건 이렇게 만들면, 나중에 상위 객체들중 이름하나 바꾸면

보기좋게 링크는 깨지고, 중간에 뭐하나 추가할 때도 이름 다시 바꿔줘야하고..


때문에 


var protoObj = {
obj_Aa : {
obj_Aa_Ba : {
obj_Aa_Ba_Ca : {
obj_Aa_Ba_Ca_Da : {},
obj_Aa_Ba_Ca_Db : {}
},
obj_Aa_Ba_Cb : {
obj_Aa_Ba_Cb_Da : {},
obj_Aa_Ba_Cb_Db : {}
}
},
obj_Aa_Bb : {
obj_Aa_Bb_Ca : {
obj_Aa_Bb_Ca_Da : {},
obj_Aa_Bb_Ca_Db : {}
},
obj_Aa_Bb_Cb : {
obj_Aa_Bb_Cb_Da : {},
obj_Aa_Bb_Cb_Db : {}
}
}
},

obj_Ab : {
obj_Ab_Ba : {
obj_Ab_Ba_Ca : {
obj_Ab_Ba_Ca_Da : {},
obj_Ab_Ba_Ca_Db : {}
},
obj_Ab_Ba_Cb : {
obj_Ab_Ba_Cb_Da : {},
obj_Ab_Ba_Cb_Db : {}
}
},
obj_Ab_Bb : {
obj_Ab_Bb_Ca : {
obj_Ab_Bb_Ca_Da : {},
obj_Ab_Bb_Ca_Db : {}
},
obj_Ab_Bb_Cb : {
obj_Ab_Bb_Cb_Da : {},
obj_Ab_Bb_Cb_Db : {}
}
}
},

obj_Ac : {
obj_Ac_Ba : {
obj_Ac_Ba_Ca : {
obj_Ac_Ba_Ca_Da : {},
obj_Ac_Ba_Ca_Db : {}
},
obj_Ac_Ba_Cb : {
obj_Ac_Ba_Cb_Da : {},
obj_Ac_Ba_Cb_Db : {}
}
},
obj_Ac_Bb : {
obj_Ac_Bb_Ca : {
obj_Ac_Bb_Ca_Da : {},
obj_Ac_Bb_Ca_Db : {}
},
obj_Ac_Bb_Cb : {
obj_Ac_Bb_Cb_Da : {},
obj_Ac_Bb_Cb_Db : {}
}
}
}
}





이런 구조를 갖고있는 객채를 함수에 집어넣으면


저위의 작업을 해주는 함수를 만들고있는데... 


대충은 밑의 코드처럼




function whereIsChildInChildrenObj(obj) {
var parent = {};
for(var child in obj) {
parent = obj[child]
for(children in parent) {
if(typeof parent[children] === "object") {
if(!Array.isArray(parent[children])) {
return true;
}
}
}
}
return false;
}



function parentProtoChain(copyObj, chainTargetObj) {
for(var keys in copyObj) {
chainTargetObj[keys] = Object.create(chainTargetObj);
}
}

var newObj = {};

var copyChild = {};
var newChild = {};
var copyParent = {};
var newParent = {};
var switchA = true;

function treeTourB(target) {
if(switchA) {
copyChild = target;
newChild = newObj;
parentProtoChain(target, newObj);
switchA = false;

}

for(var keys in target) {




if(whereIsChildInChildrenObj(copyChild)) {
copyParent = copyChild
newParent = newChild
copyChild = copyChild[keys];
newChild = newChild[keys];
parentProtoChain(copyChild, newChild);
}
else if(target[keys] === copyParent[keys]) {

copyParent = copyChild
newParent = newChild
copyChild = copyParent;
newChild = newParent[keys];

parentProtoChain(copyChild, newChild);
}
else {
console.log(keys);
return 0;
}

treeTourB(target[keys]);
}
}
treeTourB(protoObj);







지금 위의 코드 chainY는 구현하지 않고

chainX만 구현해놓은 코드입니다.


그런데.. 보시면 아시겠지만.


treeTourB가 protoObj를


obj_Aa : {
obj_Aa_Ba : {
obj_Aa_Ba_Ca : {
obj_Aa_Ba_Ca_Da : {},
obj_Aa_Ba_Ca_Db : {}
},
obj_Aa_Ba_Cb : {
obj_Aa_Ba_Cb_Da : {},
obj_Aa_Ba_Cb_Db : {}
}
},
obj_Aa_Bb : {
obj_Aa_Bb_Ca : {
obj_Aa_Bb_Ca_Da : {},
obj_Aa_Bb_Ca_Db : {}
},
obj_Aa_Bb_Cb : {
obj_Aa_Bb_Cb_Da : {},
obj_Aa_Bb_Cb_Db : {}
}
}
},



에서 

obj_Aa_Bb


여기까지만 돌고 멈춰버립니다.


코드를 보시면 아시겠지만,


protoObj를 treeTour로 재귀하면서 key값을 뱉어내면서

newObj에 프로퍼티값을 더해가는 형식입니다.


더 자세하게 설명하고싶지만..

왠지 코드를 보고있으면 머리가 이상해저버려서

잘 설명하지는 못하겠습니다.


아무튼 이런걸 처리하는 방법이 있을건데

제가 기초가 부족해서 이를 처리하는 방법을 몇날 고민해도.. 해결하지 못했습니다.


어떻게서든 풀어야하겠다고만.. 생각했고.. 계속 해서.. 부끄럽지만.. 지금 5일 지난것 같네요.


도와주세요 : )


0
  • 답변 2

  • 이박사
    391
    2017-04-27 10:14:26 작성 2017-04-27 10:16:21 수정됨

    질문이 잘 이해가 안되는데 Mixin 패턴을 구현 하고 싶으신건가요? 

    https://vnthf.github.io/blog/mixin/

  • 익명
    245
    2017-04-27 11:56:50 작성 2017-04-27 11:57:25 수정됨

    아쉽지만.. 믹스인 패턴은 아니에요..

    믹스인패터은 프로토타입링크가 끊긴 그냥

    값을 복사하는것이여서, 제가 하려는것과는 달라요.

  • 로그인을 하시면 답변을 등록할 수 있습니다.