상세 컨텐츠

본문 제목

[자바스크립트] 동적바인딩

카테고리 없음

by esoesmio 2023. 5. 16. 10:16

본문

김치찌개 파스타

const korean = {
    favorite: '김치',
    makeStew: function (isHot, pots) {
        return `${isHot ? '매운' : '순한'} ${this.favorite}찌개 ${pots}냄비`;
    }
};

const italian = {
    favorite: '피자'
};

console.log(
    korean.makeStew(true, 1)
);

// 이탈리아인에게 한국인이 찌개 끓이는 법을 알려줌
italian.makeStew = korean.makeStew;

console.log(
    italian.makeStew(false, 2)
);

 

안되네

 

const korean = {
    favorite: '김치',
    makeStew: function (isHot, pots) {
        return `${isHot ? '매운' : '순한'} ${this.favorite}찌개 ${pots}냄비`;
    }
};

const italian = {
    favorite: '피자'
};

console.log(
    korean.makeStew(true, 1)
);

// 이탈리아인에게 한국인이 찌개 끓이는 법을 알려줌
italian.makeStew = korean.makeStew;

console.log(
    italian.makeStew(false, 2)
);

console.log(
    italian.makeStew.call(korean, false, 2)
);

console.log(
    italian.makeStew.apply(korean, [false, 2])
);

// ⭐ this가 바인딩된 새 함수를 만듦
italian.makeRightStew = korean.makeStew.bind(korean);

console.log(
    italian.makeRightStew(false, 2)
);

// 💡 추가 인자들까지 바인딩 가능
italian.makeClassicStew = korean.makeStew.bind(korean, true, 1);

console.log(
    italian.makeClassicStew()
);

 

바인딩된 함수를 내보내는 함수

 

 

const korean = {
    favorite: '김치',
    makeStew: function (isHot, pots) {
        return `${isHot ? '매운' : '순한'} ${this.favorite}찌개 ${pots}냄비`;
    },
    teachMakingStew: function () {
        return this.makeStew.bind(this);
    }
};

const italian = {
    favorite: '피자'
};

italian.makeStew = korean.teachMakingStew();

console.log(
    italian.makeStew(false, 2)
);

생성자일때

 

function Korean () {
    this.favorite = '김치';
    this.makeStew = function (isHot, pots) {
        return `${isHot ? '매운' : '순한'} ${this.favorite}찌개 ${pots}냄비`;
    };

    // 💡 여기서 바인딩을 고정시켜버림
    this.makeStew = this.makeStew.bind(this);
}

function Italian () {
    this.favorite = '피자';
}


const korean = new Korean();
const italian = new Italian();

italian.makeStew = korean.makeStew;

console.log(
    italian.makeStew(false, 2)
);

 

 

call apply의 다른 활용

 

 

 

 

 

 

// 객체들이 가져다 쓰도록 만든 함수
function intro (job) {
    return `${this.name}(${this.age}세) - ${job}`
}

const hong = {
    name: '홍길동',
    age: 20
};

const jeon = {
    name: '전우치',
    age: 25
};

// 동적 바인딩 특성 활용
hong.intro = intro;

console.log(
    hong.intro('개발자')
);

console.log(intro.call(hong, '개발자'));
console.log(intro.apply(jeon, ['사무직']));

const introHong = intro.bind(hong, '개발자');

console.log(
    introHong()
);

 

 

 

 

 

 

댓글 영역