Mixin - javascript

믹스인이란 특정객체에 다른객체의 프로퍼티를 붙여넣는 기법 obj1 에 obj2를 붙여넣기 한다고 보면된다.

// 얕은복사(객체의 복사본을 만드는데 그객체의 참조만 복사함. 이렇게되면 
원본과 사본이 같은객체를 참조하게된다.)
function mixin(target, source) {
    for(var property in source) {
        if(source.hasOwnProperty(property)) {
            target[property] = source[property];
        }
    }
}

var obj1 = {a:1, b:2};
var obj2 = {b:3, c:4};
var obj = mixin(obj1, obj2);
// obj는 {a:1, b:3, c:4};

// 좀더 완전한 mixin함수
function mixin(target, source) {
    var keys = Object.keys(source); // source의 프로퍼티의 이름을 배열로 만듬
    for(var i=0; i<keys.length; i++) {
        var descriptor = Object.getOwnPropertyDescriptor(source, keys[i]); // 각프로퍼티의 디스크립터를 구함
        Object.defineProperty(target, keys[i], descriptor); // 타깃 객체에 새로운 프로퍼티를 추가함
    }    
    return target;
}

var person1 = {
    _name: "Tom",
    get name() {
        return this._name;
    }
};
var person2 = {};
mixin(person2, person2);
person2.name = "Sora";
console.log(person2.name); // Tom -> 값을 대입해도 바뀌지않았음.
console.log(person2); // Object {_nmae="Tom"}