BKJang / do-you-know-vanilla

๐ŸŒ This repository contains contents about Vanilla JS and project developed with Vanilla JS.
https://bkjang.github.io/do-you-know-vanilla
11 stars 1 forks source link

๋ชจ๋“ˆ ํŒจํ„ด(Module Pattern) #13

Open BKJang opened 5 years ago

BKJang commented 5 years ago

๐Ÿ™ Reference

BKJang commented 5 years ago

๋ชจ๋“ˆ ํŒจํ„ด(Module Pattern)

var Developer = function(arg) {
  var lang = arg ? arg : '';

  return {
    getLang : function() {
      return lang;
    },
    setLang : function(arg) {
      lang = arg;
    }

  }
};

var bkjang = new Developer('javascript');

console.log(bkjang.getLang()); //javascript

bkjang.setLang('java');

console.log(bkjang.getLang()); //java

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด Developer ์ƒ์„ฑ์ž ํ•จ์ˆ˜์—์„œ this๊ฐ€ ์•„๋‹Œ var lang = arg ? arg : '';์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜ํ˜• ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— privateํ•ด์ง„๋‹ค.

๊ทธ๋ฆฌ๊ณ  getLang() ๊ณผ setLang() ์ด๋ผ๋Š” ํ•จ์ˆ˜๋Š” ํด๋กœ์ €์ด๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ๋Š” lang์ด๋ผ๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋œ๋‹ค.

์œ„์™€ ๊ฐ™์ด getLang()๊ณผ setLang()๊ณผ ๊ฐ™์€ public ๋ฉ”์„œ๋“œ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œ๊ณตํ•˜๊ณ  lang๊ณผ ๊ฐ™์€ privateํ•œ ๋ณ€์ˆ˜์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋“ˆ ํŒจํ„ด์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด private ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์ผ ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

var Developer = function (obj) {
  var developerInfo = obj;

  return {
    getDeveloperInfo: function() {
      return developerInfo;
    }
  };
};

var developer = new Developer({ name: 'BKJang', lang: 'javascript' });

var bkJang = developer.getDeveloperInfo();
console.log('bkJang: ', bkJang);
// bkJang:  {name: "BKJang", lang: "javascript"}

bkJang.lang = 'java'; //์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ์ง์ ‘ ๋ณ€๊ฒฝ

bkJang = developer.getDeveloperInfo();
console.log('bkJang: ', bkJang);
// bkJang:  {name: "BKJang", lang: "java"}

console.log(Developer.prototype === bkJang.__proto__); //false

์ผ๋ฐ˜ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง€๊ณ  ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•  ๊ฒฝ์šฐ, ์™ธ๋ถ€์—์„œ ์ด ๋ฉค๋ฒ„๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด, ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์–•์€ ๋ณต์‚ฌ(shallow copy)๋กœ private ๋ฉค๋ฒ„์˜ ์ฐธ์กฐ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ, ๋ฐ˜ํ™˜ํ•  ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๊นŠ์€ ๋ณต์‚ฌ(deep copy)๋ฅผ ๊ฑฐ์นœ ํ›„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

๋˜ํ•œ, ์œ„์ฒ˜๋Ÿผ ์ผ๋ฐ˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” Object.prototype ๊ฐ์ฒด๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์†์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

var Developer = (function() {
  var lang;

  //์ƒ์„ฑ์ž ์ •์˜
  function Developer(arg) {
    lang = arg ? arg : '';
  }

  Developer.prototype = {
    getLang : function() {
      return lang;
    },
    setLang : function(arg) {
      lang = arg;
    }
  }

  return Developer;
}());

var bkJang = new Developer('javscript');

console.log(bkJang.getLang()); //javscript

bkJang.lang = 'java'; //์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๊ฐ€ ์•„๋‹Œ ์ง์ ‘ ๋ณ€๊ฒฝ
console.log(bkJang.getLang()); //javscript

bkJang.setLang('java');
console.log(bkJang.getLang()); //java

console.log(Developer.prototype === bkJang.__proto__); //true

๋งˆ์ง€๋ง‰ ์ถœ๋ ฅ ๊ฐ’์„ ๋ณด๋ฉด ์ธ์Šคํ„ด์Šค์ธ bkJang์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๊ฐ€ Developer.prototype ๊ฐ์ฒด์ž„์„ ์•Œ ์ˆ˜ ์žˆ๊ณ  ์ด๋Š” ์ƒ์†์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.