#
JavaScript ๊ฐ์ฒด ๊ธฐ๋ณธ๊ฐ์ฒด๋ ๊ด๋ จ๋ ๋ฐ์ดํฐ์ ํจ์์ ์งํฉ์ด๋ค. (ํ๋กํผํฐ์ ๋ฉ์๋)
๊ฐ์ฒด๋ ๊ณ ์ ์ ํจํค์ง์ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ๋ณดํธํด์ฃผ๋ ์ญํ ์ ํ๋ค.
#
๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ฐฉ์var person = { name: ['Bob', 'Smith'], age: 32, gender: 'male', interests: ['music', 'skiing'], bio: function () { alert( this.name[0] + ' ' + this.name[1] + ' is ' + this.age + ' years old. He likes ' + this.interests[0] + ' and ' + this.interests[1] + '.', ); }, greeting: function () { alert("Hi! I'm " + this.name[0] + '.'); },};
๊ฐ์ฒด์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์๋ ์ ํ๊ธฐ๋ฒ(person.name
)๊ณผ ๊ดํธ ํ๊ธฐ๋ฒ(person['age']
) ์ด ์๋ค.
this
๋ ๋ฌด์์ธ๊ฐ?#
this
ํค์๋๋ ์ง๊ธ ๋์ํ๊ณ ์๋ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
Java์์์ this
๋ ์ธ์คํด์ค ์์ (self)๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๋ณ์์ด๋ค. ์ฃผ๋ก ๋งค๊ฐ๋ณ์์๊ฐ์ฒด ์์ ์ด ๊ฐ๊ณ ์๋ ๋ฉค๋ฒ๋ณ์๋ช
์ด ๊ฐ์ ๊ฒฝ์ฐ ์ด๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
public Class Person {
private String name;
public Person(String name) { this.name = name; }}
ํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฒฝ์ฐ Java์ ๊ฐ์ด this
์ ๋ฐ์ธ๋ฉ๋๋ ๊ฐ์ฒด๋ ํ๊ฐ์ง๊ฐ ์๋๋ผ, ํจ์ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
- ํจ์ ํธ์ถ : ๊ธฐ๋ณธ์ ์ผ๋ก
this
๋ ์ ์ญ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ๋๋ค. ์ฌ์ง์ด ๋ด๋ถํจ์, ๋ฉ์๋์ ๋ด๋ถํจ์, ์ฝ๋ฐฑํจ์์ ๊ฒฝ์ฐ๋ ์ ์ญ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค. 1-1. apply/call/bind ํธ์ถ : ์ํ๋this
์ ๋ฐ์ธ๋ฉํ์ฌ ํจ์๋ฅผ ํธ์ถํ๋ค. - ๋ฉ์๋ ํธ์ถ : ๋ฉ์๋๋ฅผ ์์ ํ ๊ฐ์ฒด, ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค.
- ์์ฑ์ ํจ์ ํธ์ถ :
- ๋น ๊ฐ์ฒด ์์ฑ ๋ฐ
this
๋ฐ์ธ๋ฉ this
๋ฅผ ํตํ ํ๋กํผํฐ ์์ฑ- ์์ฑ๋ ๊ฐ์ฒด ๋ฐํ
- ๋น ๊ฐ์ฒด ์์ฑ ๋ฐ
var foo = function () { console.dir(this);};
// 1. ํจ์ ํธ์ถfoo(); // window// window.foo();
// 2. ๋ฉ์๋ ํธ์ถvar obj = {foo: foo};obj.foo(); // obj
// 3. ์์ฑ์ ํจ์ ํธ์ถvar instance = new foo(); // instance
// 4. apply/call/bind ํธ์ถvar bar = {name: 'bar'};foo.call(bar); // barfoo.apply(bar); // barfoo.bind(bar)(); // bar
#
OOPOOP์ ๊ธฐ๋ณธ ์ปจ์ ์ ์ค ์ธ๊ณ์ ์ผ๋ค์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ๋ชจ๋ธ๋งํ๊ณ , ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ด๋ ค์ธ ์ผ๋ค์ ์ฝ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.
์ฉ์ด ์ ๋ฆฌ
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ธ๋ค : encapsulate ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํ ์ด๋ฆ : namespace ์ถ์ํ : ์ค์ํ ๊ฒ๋ค๋ง ๋ฝ์์ ๋จ์ํ ๋ชจ๋ธ๋ก ๋ณํํ๋ ์์ ์ธ์คํด์ค : ํด๋์ค๋ฅผ ํตํด ๋ง๋ค์ด์ง ์ค์ ๊ฐ์ฒด (ํด๋์ค๋ ์ฒญ์ฌ์ง, ๋๋ฉด, ํ. ์ธ์คํด์ค๋ ์ฐ์ด์ ธ ๋์จ ๊ฒฐ๊ณผ๋ฌผ) ๋คํ์ฑ : polymorphism. ์ฌ๋ฌ ๊ฐ์ฒด ํ์ ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ์ํ ์ ์๋ ๋ฅ๋ ฅ
#
์์ฑ์์ ๊ฐ์ฒด ์ธ์คํด์ค- ์ผ๋ฐ์ ์ธ ํจ์๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด ์์ฑ: ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๊ตณ์ด ๋น ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๋ด์ฉ์ ์ฑ์์ ๋ฆฌํดํด์ผ ํ๋๊ฐ?
function createNewPerson(name) { var obj = {}; obj.name = name; obj.greeting = function () { alert("Hi! I'm " + this.name + '.'); }; return obj;}
var salva = createNewPerson('Salva');salva.name;salva.greeting();
- ์์ฑ์ ํจ์
new
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ด ๋์ํ๋ค.
function Person(name) { // this = {}; (๋น ๊ฐ์ฒด๊ฐ ์์์ ์ผ๋ก ๋ง๋ค์ด์ง)
// ์๋ก์ด ํ๋กํผํฐ๋ฅผ this์ ์ถ๊ฐํจ this.name = name; this.greeting = function () { alert(`Hi! I'm ${this.name}.`); };
// return this; (this๊ฐ ์์์ ์ผ๋ก ๋ฐํ๋จ)}
var salva = new Person('Salva');salva.name;salva.greeting();
๊ฐ๊ฐ์ ์๋ก ๋ค๋ฅธ namespace์ ์ ์ฅ๋์ด์๋ค. ๊ฐ์ฒด์ ํ๋กํผํฐ์ ๋ฉ์๋๋ค์ ์ฌ์ฉํ๋ ค๋ฉด, person1 ๋๋ person2๋ก๋ถํฐ ํธ์ถํ์ฌ์ผ ํ๋ค. ๋ ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ๋ฐ๋ก ํจํค์ง๋์ด์๋ก ์ถฉ๋ํ์ง ์์ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ Person ๊ฐ์ฒด๋ ๊ฐ๊ฐ ๊ณ ์ ์ name ํ๋กํผํฐ์ greeting() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด ๋์ด ์์ฑ๋ ๋ ๋ถ์ฌ๋ฐ์ ์์ ์ name ๊ฐ์์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ฃผ๋ชฉํ์. ์ด๊ฒ์ด this๋ฅผ ์ฌ์ฉํ๋ ๋งค์ฐ ์ค์ํ ์ด์ ์ค ํ๋์ด๋ค. ๊ฐ์ฒด๋ค์ ๋ค๋ฅธ ๊ฐ์ด ์๋๋ผ, ๊ทธ๋ค์ด ๊ฐ์ง ๊ณ ์ ์ ๊ฐ์ ์ฌ์ฉํ๋ค.
#
๊ฐ์ฒด ๋ฆฌํฐ๋ด๊ณผ ์์ฑ์ ํจ์ ๋ฐฉ์์ ์ฐจ์ด// ๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ฐฉ์var foo = { name: 'foo', gender: 'male',};
console.dir(foo);
// ์์ฑ์ ํจ์ ๋ฐฉ์function Person(name, gender) { this.name = name; this.gender = gender;}
var me = new Person('Lee', 'male');console.dir(me);
var you = new Person('Kim', 'female');console.dir(you);
๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ฐฉ์๊ณผ ์์ฑ์ ํจ์ ๋ฐฉ์์ ์ฐจ์ด๋ ํ๋กํ ํ์
๊ฐ์ฒด([[Prototype]])
์์๋ค.
๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ฐฉ์์ ๊ฒฝ์ฐ, ์์ฑ๋ ๊ฐ์ฒด์ ํ๋กํ ํ์
๊ฐ์ฒด๋ Object.prototype
์ด๋ค.
์์ฑ์ ํจ์ ๋ฐฉ์์ ๊ฒฝ์ฐ, ์์ฑ๋ ๊ฐ์ฒด์ ํ๋กํ ํ์
๊ฐ์ฒด๋ Person.prototype
์ด๋ค
#
์ฐธ๊ณ ์๋ฃJavaScript ๊ฐ์ฒด ์๊ฐ ํจ์ ํธ์ถ ๋ฐฉ์์ ์ํด ๊ฒฐ์ ๋๋ this JavaScript: What is the meaning of this?