JS ๐จ์ ๋ง์คํฐ ๊ฐ์ฒด(3๋ถ)
์์ฑ์๋ฅผ ์๋ก์ด ๋ถ๊ฐ์ง๋ก ์๋ก ๋ง๋์ธ์ ๐๏ธ
User ํจ์์ ๊ฐ์ ์์ฑ์๋ฅผ ๋ง๋ค ๋ ํธ์ถ์๋ new ์ฐ์ฐ์๋ก ํธ์ถํ๋ ๊ฒ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค. ํจ์๊ฐ ์์ ๊ธฐ๊ฐ ์์ ํ ์๋ก์ด ๊ฐ์ฒด๋ผ๊ณ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ชฉํ์ธ์.
function User(name, passwordHash) {
this.name = name;
this.passwordHash = passwordHash;
}
ํธ์ถ์๊ฐ new ํค์๋๋ฅผ ์์ด๋ฒ๋ฆฐ ๊ฒฝ์ฐ ํจ์์ ์์ ์๋
์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฉ๋๋ค.
var u = User("baravelli", "d8b74df393528d51cd19980ae0aa028e");
u; // undefined
this.name; // "baravelli"
this.passwordHash; // "d8b74df393528d51cd19980ae0aa028e"
Not only does the function uselessly return undefined, it also disas-
trously creates (or modifies, if they happen to exist already) the global
variables name and passwordHash.
์ฌ์ฉ์ ๊ธฐ๋ฅ์ด ES5 ์๊ฒฉํ ์ฝ๋๋ก ์ ์๋ ๊ฒฝ์ฐ ์์ ์๋
๊ธฐ๋ณธ๊ฐ์ ์ ์๋์ง ์์:
function User(name, passwordHash) {
"use strict";
this.name = name;
this.passwordHash = passwordHash;
}
var u = User("baravelli", "d8b74df393528d51cd19980ae0aa028e");
// error: this is undefined
In this case, the faulty call leads to an immediate error: The first line
of User attempts to assign to this.name, which throws a TypeError. So,
at least with a strict constructor function, the caller can quickly dis-
cover the bug and fix it.
๊ทธ๋ฌ๋ ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ฌ์ฉ์ ๊ธฐ๋ฅ์ ์ทจ์ฝํฉ๋๋ค. ์๊ฒ๊ณผ ํจ๊ป ์ฌ์ฉ์
์์๋๋ก ์๋ํ์ง๋ง ์ผ๋ฐ ๊ธฐ๋ฅ์ผ๋ก ์ฌ์ฉํ๋ฉด ์คํจํฉ๋๋ค. ใ
๋ณด๋ค ๊ฐ๋ ฅํ ์ ๊ทผ ๋ฐฉ์์ ์ฐ๊ฒฐ ์ญํ ์ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค.
์ด๋ป๊ฒ ๋ถ๋ฌ๋ ๊ตฌ์กฐ์ฒด. ์ด๊ฒ์ ๊ตฌํํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์
์์ ์ ๊ฐ์ด User์ ์ ์ ํ ์ธ์คํด์ค์ธ์ง ํ์ธํ์ญ์์ค.
function User(name, passwordHash) {
if (!(this instanceof User)) {
return new User(name, passwordHash);
}
this.name = name;
this.passwordHash = passwordHash;
}
์ด๋ ๊ฒ ํ๋ฉด User ํธ์ถ์ ๊ฒฐ๊ณผ๋ ํจ์ ๋๋ ์์ฑ์๋ก ํธ์ถ๋๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด
User.prototype
์์ ์์๋๋ ๊ฐ์ฒด์
๋๋ค.let x = User("baravelli", "d8b74df393528d51cd19980ae0aa028e");
let y = new User("baravelli", "d8b74df393528d51cd19980ae0aa028e");
x instanceof User; // true
y instanceof User; // true
์ด ํจํด์ ํ ๊ฐ์ง ๋จ์ ์ ์ถ๊ฐ ํจ์ ํธ์ถ์ด ํ์ํ๋ฏ๋ก ์ฝ๊ฐ ๋ ๋น์๋๋ค. ๊ฐ๋ณ ํจ์๋ฅผ ์์ฑ์๋ก ํธ์ถํ๊ธฐ ์ํ ์ ์ฉ ๋ฉ์๋์ ์ง์ ์ ์ธ ์ ์ฌ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ ํจ์์๋ ์ฌ์ฉํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ข ๋ ์ด๊ตญ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ES5
Object.create
๋ฅผ ์ฌ์ฉํฉ๋๋ค.function User(name, passwordHash) {
let self = this instanceof User ? this : Object.create(User.prototype);
self.name = name;
self.passwordHash = passwordHash;
return self;
}
Object.create
takes a prototype object and returns a new object that inherits from it. So when this version of User is called as a function, the result is a new object inheriting fromUser.prototype
, with the name and passwordHash properties initialized.
Object.create๋ ES5์์๋ง ์ฌ์ฉํ ์ ์์ง๋ง ๊ทผ์ฌํ ์ ์์ต๋๋ค.
๋ก์ปฌ ์์ฑ์์ ์ธ์คํด์คํ๋ฅผ ์์ฑํ์ฌ ์ด์ ํ๊ฒฝ์์
์๋ก์ด ๊ฒ์ผ๋ก ๊ทธ๊ฒ์ ing:
if (typeof Object.create === "undefined") {
Object.create = function (prototype) {
function C() {}
C.prototype = prototype;
return new C();
};
}
Note that this only implements the single-argument version of
Object.create
. The real version also accepts an optional second argument that describes a set of property descriptors to define on the new object.
๋๊ตฐ๊ฐ๊ฐ ์ด ์ ๋ฒ์ ์ ์ฌ์ฉ์๋ฅผ new๋ก ํธ์ถํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
์์ฑ์ ์ฌ์ ์ ํจํด ๋๋ถ์ ํจ์ ํธ์ถ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ํฉ๋๋ค. ์ด๊ฒ์ JavaScript๊ฐ ์์ฑ์ ํจ์์ ๋ช ์์ ๋ฐํ์ผ๋ก ์ ํํ์์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ ์ํ ์ ์๋๋ก ํ๊ธฐ ๋๋ฌธ์ ์๋ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ self๋ฅผ ๋ฐํํ ๋ ์ ํํ์์ ๊ฒฐ๊ณผ๋ self๊ฐ ๋๋ฉฐ ์ด๋ ์ด์ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ฒด์ ๋ค๋ฅธ ๊ฐ์ฒด์ผ ์ ์์ต๋๋ค.
ํนํ ์์ฑ์๋ฅผ ๋ก์ปฌ์์๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ค์ฉ์ผ๋ก๋ถํฐ ์์ฑ์๋ฅผ ๋ณดํธํ๋ ๊ฒ์ด ํญ์ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ ์๋๋๋ค.
๊ทธ๋๋ ์์ฑ์๊ฐ ์๋ชป๋ ๋ฐฉ์์ผ๋ก ํธ์ถ๋๋ฉด ์ํฉ์ด ์ผ๋ง๋ ์ฌ๊ฐํ๊ฒ ์๋ชป๋ ์ ์๋์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ต์ํ ์์ฑ์ ํจ์๊ฐ new๋ก ํธ์ถ๋ ๊ฒ์ผ๋ก ์์๋๋ ๋๋ฅผ ๋ฌธ์ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํนํ ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค ๋๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ณต์ ํ ๋ ๊ทธ๋ ์ต๋๋ค.
๊ธฐ์ตํด์ผ ํ ๊ฒ๋ค ๐ง
Object.create
๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ ๋ค์ ํธ์ถํ์ฌ ํธ์ถ์์ ๊ตฌ๋ฌธ์ ๊ตฌ์ ๋ฐ์ง ์๋ ์์ฑ์๋ฅผ ๋ง๋ญ๋๋ค. ๐๐๐ ์ด ๊ธฐ์ฌ์ ์ธ ๋ฒ์งธ ๋ถ๋ถ์ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๐๐๐
๊ทธ๋ฆฌ๊ณ ์ข์ํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ํด ๋ ๊น์ด ์๊ณ ์ถ๋ค๋ฉด ์ฃผ๋ฌธํ ๊ฐ๋ฐ์๊ฐ ๋๊ธฐ ์ํด ์ ๊ฐ์ธ ์ ๋ณดblog๋ฅผ ํ์ธํ์ธ์. ๐์์๋ ์ ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค๐.
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(JS ๐จ์ ๋ง์คํฐ ๊ฐ์ฒด(3๋ถ)), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/jrmatanda/master-objects-in-js-part-3-4m9jํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค