javascript pattern - JeongWu/fe-javascript GitHub Wiki

javascript pattern

๋ฉ”์„œ๋“œ ๋นŒ๋ฆฌ๊ธฐ

๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ์ž์‹ ์˜ ๊ฒƒ ์ฒ˜๋Ÿผ ์‚ฌ์šฉ๊ฐ€๋Šฅ

var obj1 = {
    method: function() {
        this.val = 2
    }
};
var obj2 = {};
obj2.method = obj1.method;
obj2.method();
obj2  //->{ method: function, val: 2}
  • ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์— Array ๋งค์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋–„ ์ž์ฃผ ์‚ฌ์šฉ๋จ
function fn() {
    arguments.forEach = Array.prototype.forEach;
    arguments.forEach(function(v) {
        console.log(v)
    });
}
fn(1, 2, 3);  //1 2 3


function fn2() {
    Array.prototype.forEach.call(arguments, function(v) {
        console.log(v)
    });
}
fn(1, 2, 3);  //1 2 3

๋ฏน์Šค์ธ

ํ•œ ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฑฐ ๋„˜๊ฒจ์ฃผ๊ฑฐ๋‚˜ ๋‘๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ๊ฒƒ

var obj1 = {
    a: 1,
    b: 2
};
var obj2 = {
    c: 3,
    d: 4
};
var mixin = {};

for (var key in obj1) {
    mixin[key] = obj1[key]
};

for (var key in obj2) {
    mixin[key] = obj2[key]
};

//es6
var mixin={...obj1, ...obj2}

๋• ํƒ€์ดํ•‘

๋ฉ”์„œ๋“œ ์ธก์—์„œ ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋ฅผ ๊ฒ€์ฆ

var obj1 = {
    val: 2,
    method: function() {
        if (!this.val) {
            throw new Error("val ์—†์Œ");
        }
        return this.val;
    }
};
var obj2 = {};
obj2.method = obj1.method;
obj1.method(); //2
obj2.method(); //Error

๋„ค์ž„์ŠคํŽ˜์ด์Šค ํŒจํ„ด

์ „์—ญ ๋ฒ”์œ„๋ฅผ ๊ฐ–์ง€ ์•Š๊ฒŒ ๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ๊ฐ€๋‘๋Š” ๊ฒƒ

var a = 1;
var b = 2;
//๊ฐ์ฒด ๋งด๋ฒ„
var names = {
    a: 3,
    b: 4
}
names.a;
names.b;

//์ฆ‰์‹œ ์‹คํ–‰ํ•จ์ˆ˜
(function() {
    var a = 5;
    var b = 6;
    a    //5
    b    //6

}
)();

๋ชจ๋“ˆ ํŒจํ„ด

๋กœ์ง์„ ์ „์—ญ์œผ๋กœ ๋ถ„๋ฆฌํ•ด ๋…๋ฆฝ๋œ ์ฝ”๋“œ ์ƒ์„ฑ

//๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ์ด์šฉ
var obj = {
    method: function() {},
    a: 123,
}

//์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜, ํด๋กœ์ € ์ด์šฉ
var obj = (function() {
    function privateFn() {}
    var privateVar = 1;
    return {
        publicFn: function() {
            privateFn();
            return privateVar;
        }
    }
}
)()

์ฒด์ด๋„ˆ๋ธ” ๋ฉ”์„œ๋“œ

๊ฐ์ฒด๋ช…์„ ๋‹ค์‹œ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด ๋™์ผํ•œ ๊ฐ์ฒด์˜ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ๊ฐ€๋Šฅ

var obj = {
    a: function() {
        console.log("a");
        return this;  //return this ์ถ”๊ฐ€
    },
    b: function() {
        console.log("b");
        return this;  //return this ์ถ”๊ฐ€
    },
}

obj.a().b().a().b();

์ปค๋ง(curring)

ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด ํ•จ์ˆ˜์˜ ์ธ์ž๋ฅผ ๋ฏธ๋ฆฌ ๋“ฑ๋ก

function add(a, b) {
    return a + b;
}

add(1, 2)  //3

function curry(a) {
    return function(b) {
        return add(a, b);
    }
}

var add1 = curry(1);
add1(2);  //3

//es6 ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
var add = a=>b=>a + b

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ์„œ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

var obj = {
    add: function(a, b) {
        return a + b;
    }
}

var add = obj.add;
obj.add = function(a, b) {
    console.log(a, b);
    return add(a, b);
}

obj.add(1, 2);    //1 2  
                  // 3

๋ฉ”๋ชจ์ด์ œ์ด์…˜

ํ•จ์ˆ˜๋‚ด์— ๋ถˆํ•„์š”ํ•œ ์ž‘์—…์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „์— ์—ฐ์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉ

function factorial(n) {
    if (n <= 1)
        return 1;
    return n * factorial(n - 1);
}

var factorial = (function() {
    var cache = [1, 1];
    return function(n) {
        if (!cache[n])
            cache[n] = n * factorial(n - 1);
    }
    return cache[n];
}
)();