Open BKJang opened 5 years ago
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
๊ฐ์ฒด์์ ์ ์ ์๊ณ ์ด๋ ์์์ ๊ตฌํํ ์ ์์์ ์๋ฏธํ๋ค.
๐ Reference