[Javascript] this
CHAPTER1 this๋ผ๋ ๋ญ๋ผ๋
YOU DON_T KNOW JS - this
- ๊ฐ์ฅ ํท๊ฐ๋ฆฌ๋ ๋งค์นด๋์ฆ ์ค ํ๋ this ํค์๋
- this๋ ๋ชจ๋ ํจ์ ์ค์ฝํ ๋ด์ ์๋์ผ๋ก ์ค์ ๋๋ ํน์ํ ์๋ณ์
๋ชจ๋ ๊ธฐ์ ์ด ๊ณ ๋๋ก ๋ฐ์ ํ๋ฉด ๋ง์ ๊ณผ ๊ตฌ๋ณํ๊ธฐ ์ด๋ ค์์ง๋ค. |
1.1 this๋ฅผ ์?
- this์ ์ ์ฉํจ๊ณผ ์ฌ์ฉ ๋๊ธฐ
- ๋ค์ ์ฝ๋๊ฐ โ์ด๋ป๊ฒโ ์๋ํ๋์ง ๋ณด๋ค, โ์โ ์ฌ์ฉํ๋์ง ๋ณด์
identify()
์speak()
๋ ํจ์๋ ๊ฐ์ฒด๋ณ๋ก ๋ฐ๋ก๋ฐ๋ก ํจ์๋ฅผ ์์ฑํ ํ์ ์์ด ๋ค์ค ์ฝํ ์คํธ ๊ฐ์ฒด์ธ me์ you ๋ชจ๋์์ ์ฌ์ฌ์ฉํ ์ ์๋ค.
function identify(){
return this.name.toUpperCase();
}
function speak() {
var greeting = `Hello, I'm ${identify.call( this )}`;
console.log( greeting );
}
var me = {
name: 'Kyle'
};
var you = {
name: 'Reader'
};
identify.call( me ); // KYLE
identify.call( you ); // READER
speak.call( me ); // Hello, I'm KYLE
speak.call( you ); // Hello, I'm READER
-
this๋ฅผ ์ ์ฐ๊ณ identify()์ speak() ํจ์์ ์ฝํ ์คํธ ๊ฐ์ฒด๋ฅผ ๋ช ์ํ ์๋ ์๋ค.
function identify(context){
return context.name.toUpperCase();
}
function speak(context) {
var greeting = `Hello, I'm ${ context }`;
console.log( greeting );
}
identify( you ); // READER
speak( me ); // Hello, I'm KYLE
- ํ์ง๋ง ์์์ ์ธ ๊ฐ์ฒด ๋ ํผ๋ฐ์ค๋ฅผ ํจ๊ป ๋๊ธฐ๋
Passing Along
this ์ฒด๊ณ๊ฐ API ์ค๊ณ์ ์ข ๋ ๊น๋ํ๊ณ ๋ช ํํ๋ฉฐ ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ๋ค. - ์ฌ์ฉ ํจํด์ด ๋ณต์กํด์ง์๋ก ์ฝํ ์คํธ๋ฅผ ๋๊ธฐ๋ ๋ฐฉ๋ฒ์ด ๋ ์ง์ ๋ถํด์ง๋ค.
1.2 ํท๊ฐ๋ฆฌ๋ ๊ฒ๋ค
- ์ฌ๋๋ค์ ๋ณดํต ๋ ๊ฐ์ง์ ์๋ฏธ๋ก ํด์ํ๋๋ฐ ๋ ๋ค ํ๋ ธ๋ค.
1.2.1 ์๊ธฐ ์์
- this๊ฐ ํจ์ ๊ทธ ์์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค๋ ์คํด๋ค.
1.2.2 ์์ ์ ์ค์ฝํ
- this๋ ์ด๋ค ์์ผ๋ก๋ ํจ์์ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ์ฐธ์กฐํ์ง ์๋๋ค.
1.3 this๋ ๋ฌด์์ธ๊ฐ?
- this๋ ์์ฑ ์์ ์ด ์๋ ๋ฐํ์ ์์ ์ ๋ฐ์ธ๋ฉ ๋๋ฉฐ ํจ์ ํธ์ถ ๋น์ ์ํฉ์ ๋ฐ๋ผ ์ฝํ ์คํธ๊ฐ ๊ฒฐ์ ๋๋ค.
- ์ด๋ป๊ฒ ํจ์๋ฅผ ํธ์ถํ๋๋์ ๋ฐ๋ผ ์ ํด์ง๋ค.
- ์ด๋ค ํจ์๋ฅผ ํธ์ถํ๋ฉด ํ์ฑํ ๋ ์ฝ๋
Activation Record
, ์ฆ ์คํ ์ฝํ ์คํธExecution Context
๊ฐ ๋ง๋ค์ด์ง๋ค. ์ฌ๊ธฐ์ ํจ์๊ฐ ํธ์ถ๋ ๊ทผ์(์ฝ์คํCall-Stack
)๊ณผ ํธ์ถ ๋ฐฉ๋ฒ, ์ ๋ฌ๋ ์ธ์ ๋ฑ์ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋ค. this ๋ ํผ๋ฐ์ค๋ ๊ทธ์ค ํ๋๋ก, ํจ์๊ฐ ์คํ๋๋ ๋์ ์ด์ฉํ ์ ์๋ค. - ๋ค์ ์ฅ์์๋ this ๋ฐ์ธ๋ฉ์ ๊ฒฐ์ ์ง๋ ํจ์ ํธ์ถ๋ถ
Call-Site
๋ฅผ ์ค๋ช ํ๋ค.
CHAPTER2 this๊ฐ ์ด๋ฐ ๊ฑฐ๋ก๊ตฐ!
- this๋ ํธ์ถ๋ถ์์ ํจ์๋ฅผ ํธ์ถํ ๋ ๋ฐ์ธ๋ฉ ๋๋ค.
๊ฝ, ๊น์ถ์
๋ด๊ฐ ๊ทธ์ ์ด๋ฆ์ ๋ถ๋ฌ ์ฃผ๊ธฐ ์ ์๋
๊ทธ๋ ๋ค๋ง
ํ๋์ ๋ชธ์ง์ ์ง๋์ง ์์๋ค.
๋ด๊ฐ ๊ทธ์ ์ด๋ฆ์ ๋ถ๋ฌ ์ฃผ์์ ๋
๊ทธ๋ ๋์๊ฒ๋ก ์์
๊ฝ์ด ๋๋ค.
2.1 ํธ์ถ๋ถ
- this ๋ฐ์ธ๋ฉ์ ๊ฐ๋ ์ ์ดํดํ๋ ค๋ฉด ๋จผ์ ํธ์ถ๋ถ, ์ฆ ํจ์ ํธ์ถ ์ฝ๋๋ถํฐ ํ์ธํ๊ณ โthis๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฒโ์ด ๋ฌด์์ธ์ง ์ฐพ์๋ด์ผ ํ๋ค.
function baz() {
// ํธ์ถ ์คํ: 'baz'
// ํธ์ถ๋ถ๋ ์ ์ญ ์ค์ฝํ ๋ด๋ถ
console.log( "baz" );
bar(); // <- 'bar'์ ํธ์ถ๋ถ
}
function bar() {
// ํธ์ถ ์คํ: 'baz' -> 'bar'
// ํธ์ถ๋ถ๋ 'baz' ๋ด๋ถ
console.log( "bar" );
foo(); // <- 'foo'์ ํธ์ถ๋ถ
}
function foo() {
// ํธ์ถ ์คํ: 'baz' -> 'bar' -> 'foo'
// ํธ์ถ๋ถ๋ 'bar' ๋ด๋ถ
console.log( "foo" );
}
baz(); // <- 'baz'์ ํธ์ถ๋ถ
2.2 ๋จ์ง ๊ท์น์ผ ๋ฟ
- 4๊ฐ์ง ๊ท์น
2.2.1 ๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ
- default ๊ท์น
function foo() {
console.log( this.a );
}
var a = 2;
foo(); // 2
- ๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ์ด ์ ์ฉ๋์ด this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.
2.2.2 ์์์ ๋ฐ์ธ๋ฉimplicit Binding
- ํธ์ถ๋ถ์ ์ฝํ
์คํธ ๊ฐ์ฒด๊ฐ ์๋์ง, ์ฆ ๊ฐ์ฒด์ ์์
Owning
/ํฌํจContaining
์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๊ฒ์ด๋ค.
function foo() {
console.log( this.a );
}
var obj = {
a: 2,
foo: foo // ์์์ ์ ์ธํ foo() ํจ์๋ฅผ ์ฐธ์กฐ
}
obj.foo(); // 2
- ํธ์ถ๋ถ๋ obj ์ฝํ ์คํธ๋ก foo()๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก obj ๊ฐ์ฒด๋ ํจ์ ํธ์ถ ์์ ์ ํจ์์ ๋ ํผ๋ฐ์ค๋ฅผ โ์์ โํ๊ฑฐ๋ โํฌํจโํ๋ค๊ณ ๋ณผ ์ ์๋ค.
- ์์์ ๋ฐ์ธ๋ฉ ๊ท์น์ ๋ฐ๋ฅด๋ฉด ๋ฐ๋ก ์ด obj ์ฝํ ์คํธ ๊ฐ์ฒด๊ฐ ํจ์ ํธ์ถ ์ this์ ๋ฐ์ธ๋ฉ ๋๋ค.
- ๋ค์ ์์ ์ฒ๋ผ ๊ฐ์ฒด ํ๋กํผํฐ ์ฐธ์กฐ๊ฐ ์ฒด์ด๋
Chaining
๋ ํํ๋ผ๋ฉด ์ต์์Top
/์ตํ์Last
์์ค์ ์ ๋ณด๋ง ํธ์ถ๋ถ์ ์ฐ๊ด๋๋ค.
function foo() {
console.log( this.a );
}
var obj2 = {
a: 42,
foo: foo
};
var obj1 = {
a:2,
obj2: obj2
};
obj1.obj2.foo(); // 42
์์์ ์์ค
- โ์์์ ์ผ๋ก ๋ฐ์ธ๋ฉ ๋
implicitly Bound
โ ํจ์์์ ๋ฐ์ธ๋ฉ์ด ์์ค๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. - strict mode ์ฌ๋ถ์ ๋ฐ๋ผ ์ ์ญ ๊ฐ์ฒด๋ undefined ์ค ํ ๊ฐ์ง๋ก ๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ ๋๋ค.
function foo() {
console.log( this.a );
}
var obj = {
a: 2,
foo: foo
};
var bar = obj.foo; // ํจ์ ๋ ํผ๋ฐ์ค/๋ณ๋ช
var a = "์ฅ, ์ ์ญ์ด๋ค!" // 'a' ์ญ์ ์ ์ญ ๊ฐ์ฒด์ ํ๋กํผํฐ
bar(); // "์ฅ, ์ ์ญ์ด๋ค!"
- bar๋ obj์ foo๋ฅผ ์ฐธ์กฐํ๋ ๋ณ์์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ foo๋ฅผ ์ง์ ๊ฐ๋ฆฌํค๋ ๋ ๋ค๋ฅธ ๋ ํผ๋ฐ์ค๋ค.
- ๊ฒ๋ค๊ฐ ํธ์ถ๋ถ์์ ๊ทธ๋ฅ ํ๋ฒํ๊ฒ
bar()
๋ฅผ ํธ์ถํ๋ฏ๋ก ๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ์ด ์ ์ฉ๋๋ค. - ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ์ฐ์ ์ข ๋ ์ ๋งคํ๊ฒ ์คํ๋์ด ์์์ธ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
function foo() {
console.log( this.a );
}
function doFoo(fn) {
// 'fn'์ 'foo'์ ๋ ๋ค๋ฅธ ๋ ํผ๋ฐ์ค์ผ ๋ฟ์ด๋ค.
fn(); // <- ํธ์ถ๋ถ
}
var obj = {
a:2,
foo:foo
};
var a = "์ฅ, ์ ์ญ์ด๋ค!"; // 'a' ์ญ์ ์ ์ญ ๊ฐ์ฒด์ ํ๋กํผํฐ
doFoo( obj.foo ); // "์ฅ, ์ ์ญ์ด๋ค!"
- ์ฝ๋ฐฑ์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ํจ์๊ฐ ๋ด์ฅ ํจ์๋ผ๋ ๊ฒฐ๊ณผ๋ ๋ง์ฐฌ๊ฐ์ง๋ค. (์์ ์๋ต)
2.2.3 ๋ช ์์ ๋ฐ์ธ๋ฉ
2.2.4 new ๋ฐ์ธ๋ฉ
2.3 ๋ชจ๋ ๊ฑด ์์๊ฐ ์๋ ๋ฒ
2.3.1 this ํ์ ๊ท์น
2.4 ๋ฐ์ธ๋ฉ ์์ธ
2.4.1 this ๋ฌด์
2.4.2 ๊ฐ์ ๋ ํผ๋ฐ์ค
2.4.3 ์ํํธ ๋ฐ์ธ๋ฉ
2.5 ์ดํ์ this
- ES6 ํ์ดํ ํจ์๋ 4๊ฐ์ง ํ์ค ๊ท์น ๋์ ์๋๋ฅธ ์ค์ฝํ
Enclosing Scope
(ํจ์ ๋๋ ์ ์ญ)๋ฅผ ๋ณด๊ณthis
๋ฅผ ์์์ ๋ฐ์ธ๋ฉ ํ๋ค. - ๋ค์์ ํ์ดํ ํจ์์ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ๋ํ๋ธ ์์ ๋ค.
function foo() {
// ํ์ดํํจ์๋ฅผ ๋ฐํํ๋ค.
return (a) => {
// ์ฌ๊ธฐ์ 'this'๋ ์ดํ์ ์ผ๋ก 'foo()'์์ ์์๋๋ค.
console.log( this.a );
};
}
var obj1 = {
a: 2
}
var obj2 = {
a: 3
}
var bar = foo.call( obj1 );
bar.call( obj2 ); // 2, 3์ด ์๋๋ค!
- foo() ๋ด๋ถ์์ ์์ฑ๋ ํ์ดํ ํจ์๋ foo() ํธ์ถ ๋น์ this๋ฅผ ๋ฌด์กฐ๊ฑด ์ดํ์ ์ผ๋ก ํฌ์ฐฉํ๋ค. foo()๋ obj1์ this๊ฐ ๋ฐ์ธ๋ฉ ๋๋ฏ๋ก bar(๋ฐํ๋ ํ์ดํ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์)์ this ์ญ์ obj1๋ก ๋ฐ์ธ๋ฉ ๋๋ค. ํ์ดํ ํจ์์ ์ดํ์ ๋ฐ์ธ๋ฉ์ ์ ๋๋ก ์ค๋ฒ๋ผ์ด๋ํ ์ ์๋ค.
- ES6 ์ด์ ์๋ ํ์ดํ ํจ์์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์์, ๋๋ฆ๋๋ก ๋ง์ด ์ฐ์ด๋ ํจํด์ด ์์๋ค.
function foo() {
var self = this; // 'this'๋ฅผ ์ดํ์ ์ผ๋ก ํฌ์ฐฉํ๋ค.
setTimeout( function(){
console.log( self.a );
}, 100 );
}
var obj = {
a: 2
};
foo.call( obj ); // 2
- this ์คํ์ผ์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ ๊ฒฝ์ฐ ๊ผญ ๋ค์ ๋ ๊ฐ์ง ์ค ํ๋๋ง ์ ํํ์.
- ์ค์ง ๋ ์์ปฌ ์ค์ฝํ๋ง ์ฌ์ฉํ๊ณ ๊ฐ์์ ์ธ this ์คํ์ผ์ ์ฝ๋๋ ์ ์ด๋๋ค.
- ํ์ํ๋ฉด bind()๊น์ง ํฌํจํ์ฌ ์์ ํ this ์คํ์ผ์ ์ฝ๋๋ฅผ ๊ตฌ์ฌํ๋ self = this๋ ํ์ดํ ํจ์ ๊ฐ์ ์์ โ์ดํ์ thisโ๊ผผ์๋ ์ผ๊ฐ์ผ ํ๋ค.
- ๋ ์คํ์ผ ๋ชจ๋ ์ ์ ํ ํผ์ฉํ์ฌ ํจ์จ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ ํ ์๋ ์๊ฒ ์ง๋ง ๋์ผ ํจ์ ๋ด์์ ๋๊ฐ์ ๊ฒ์ ์ฐพ๋๋ฐ ์๋ก ๋ค๋ฅธ ์คํ์ผ์ด ์์ฌ ์์ผ๋ฉด ๊ด๋ฆฌ๋ ์ ์๋๊ณ ๊ฐ๋ฐ์๊ฐ ์ฒ์ฌ๊ฐ ์๋ ์ด์ ์ดํดํ๊ธฐ ๊ณค๋ํ ๊ณจ์นซ๋ฉ์ด ์ฝ๋๋ก ๋จ๊ฒ ๋ ๊ฒ์ด๋ค.
2.6 ์ ๋ฆฌํ๊ธฐ
- ํจ์ ์คํ์ ์์ด์ this ๋ฐ์ธ๋ฉ์ ํจ์์ ์ง์ ์ ์ธ ํธ์ถ๋ถ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค. ์ผ๋จ ํธ์ถ๋ถ๋ฅผ ์๋ณํ ํ ๋ค์ 4๊ฐ์ง ๊ท์น์ ์ด๊ฑฐํ ์ฐ์ ์์์ ๋ฐ๋ผ ์ ์ฉํ๋ค.
- new๋ก ํธ์ถํ๋ค๋ฉด ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ก ๋ฐ์ธ๋ฉ ๋๋ค.
- call์ด๋ apply ๋๋ bind๋ก ํธ์ถ๋๋ค๋ฉด ์ฃผ์ด์ง ๊ฐ์ฒด๋ก ๋ฐ์ธ๋ฉ ๋๋ค.
- ํธ์ถ์ ์ฃผ์ฒด์ธ ์ฝํ ์คํธ ๊ฐ์ฒด๋ก ํธ์ถ๋๋ค๋ฉด ๋ฐ๋ก ์ด ์ฝํ ์คํธ ๊ฐ์ฒด๋ก ๋ฐ์ธ๋ฉ ๋๋ค.
- ๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ์์ ์๊ฒฉ ๋ชจ๋๋ undefined, ๊ทธ ๋ฐ์ ์ ์ญ ๊ฐ์ฒด๋ก ๋ฐ์ธ๋ฉ ๋๋ค.
- this ๋ฐ์ธ๋ฉ์ ์์ ํ๊ฒ ํ๊ณ ์ถ์ผ๋ฉด
โ = Object.create(null)
์ฒ๋ผ DMZ ๊ฐ์ฒด๋ฅผ ์๋ฆฌ ๋ผ์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ๋ฃ์ด ๋ปํ์ง ์์ ๋ถ์ ํจ๊ณผ๊ฐ ์ ์ญ ๊ฐ์ฒด์์ ๋ฐ์ํ์ง ์๊ฒ ํ๋ค. -
ES6 ํ์ดํ ํจ์๋ ํ์ค ๋ฐ์ธ๋ฉ ๊ท์น์ ๋ฌด์ํ๊ณ ๋ ์์ปฌ ์ค์ฝํ๋ก this๋ฅผ ๋ฐ์ธ๋ฉ ํ๋ค. ์ฆ, ์๋๋ฅธ ํจ์ ํธ์ถ๋ก๋ถํฐ ์ด๋ค ๊ฐ์ด๋ this ๋ฐ์ธ๋ฉ์ ์์ํ๋ค. ์ด๋ ES6 ์ด์ ์์ self = this ๊ตฌ๋ฌธ์ ๋์ฒดํ ์ฅ์น๋ค.
- #ref: ๊ฐ์ ์ฑ , ๋ ์ ์ ๋ฆฌ๋ ๊ธ - https://jeonghwan-kim.github.io/2017/10/22/js-context-binding.html
CHAPTER3 ๊ฐ์ฒด
- ๊ฐ์ฒด๋ ์ ํํ ๋ฌด์์ด๊ณ this๋ฅผ ๋ฐ์ธ๋ฉํ ๋ ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ ํ ๊น?
3.1 ๊ตฌ๋ฌธ
- ๊ฐ์ฒด๋ ์ ์ธ์
Declarative
(๋ฆฌํฐ๋ดLiteral
) ํ์๊ณผ ์์ฑ์ ํ์, ๋ ๊ฐ์ง๋ก ์ ์ํ๋ค. - ๋ฆฌํฐ๋ด ํ์
var myObj = {
key: value
// ...
}
- ์์ฑ์ ํ์
var myObj = new Object();
myObj.key = value;
3.2 ํ์
- ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ 7๊ฐ ์ฃผ์ ํ์
(๋ช
์ธ์์ โ์ธ์ด ํ์
Language Type
โ์ด๋ผ๊ณ ํํํ๋ค)์ ๋ค์๊ณผ ๊ฐ๋ค.
1. null
2. undefined
3. boolean
4. number
5. string
6. object
7. symbol
- โ๋จ์ ์์ ํ์
Simple Primitive
(string, number, null, undefined)โ์ ๊ฐ์ฒด๊ฐ ์๋๋ค. - ๋ฐ๋ฉด โ๋ณตํฉ ์์ ํ์
Complex Primitive
โ์ด๋ผ๋ ๋ ํนํ ๊ฐ์ฒด ํ์ ํ์Sub Type
์ด ์๋ค. function์ ๊ฐ์ฒด(์ ํํ๋ ํธ์ถ ๊ฐ๋ฅํ ๊ฐ์ฒดCallable Object
)์ ํ์ ํ์ ์ด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก๋ (ํธ์ถ ๊ฐ๋ฅํ ํน์ฑ์ด ๊ณ ์ ๋) ๊ฐ์ฒด์ด๋ฏ๋ก โ์ผ๊ธFirst Class
โ์ด๋ฉฐ ์ฌํ์ ์ผ๋ฐ ๊ฐ์ฒด์ ๋๊ฐ์ด ์ทจ๊ธ๋๋ค. - ๋ฐฐ์ด ์ญ์ ์ถ๊ฐ ๊ธฐ๋ฅ์ด ๊ตฌํ๋ ๊ฐ์ฒด์ ์ผ์ข ์ด๋ค. ๋ค๋ฅธ ์ผ๋ฐ ๊ฐ์ฒด๋ณด๋ค ์ข ๋ ์กฐ์ง์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๊ตฌ์ฑ๋๋ ํน์ง์ด ์๋ค.
3.2.1 ๋ด์ฅ ๊ฐ์ฒด
- ๋ด์ฅ ๊ฐ์ฒด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฐ์ฒด ํ์ ํ์ ๋ ์๋ค.
- String
- Number
- Boolean
- Object
- Function
- Array
- Date
- RegExp
- Error
- ์ด๋ค์ ๋จ์ง ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ด์ฅ ํจ์์ผ ๋ฟ ๊ฐ๊ฐ ์์ฑ์
Constructor
๋ก ์ฌ์ฉ๋์ด ์ฃผ์ด์ง ํ์ ํ์ ์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
var strPrimitive = 'I am string!';
typeof strPrimitive; // "string"
strPrimitive instanceof String // false
var strObject = new String('I am string!');
typeof strObject; // "object"
strObject instanceof String; // true
// ๊ฐ์ฒด ํ์ ํ์
์ ํ์ธํ๋ค.
Object.prototype.toString.call( strObject ); // [Object String]
-
Object.prototype.toString
๋ถ๋ถ์ toString() ๋ฉ์๋์ ๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ฅผ ๋น๋ ค์ ๋ด๋ถ ํ์ ํ์ ์ ์กฐ์ฌํ๋ค. ๊ทธ ๊ฒฐ๊ณผ strObject๊ฐ String ์์ฑ์์ ์ํด ๋ง๋ค์ด์ง ๊ฐ์ฒด์์ ์ ์ ์๋ค. - ์์ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ ์์ ๋ฆฌํฐ๋ด
Primitive Literal
์ด๋ฉฐ ๋ถ๋ณ๊ฐImmutable Value
์ด๋ค. ๋ฌธ์ ๊ฐ์๋ฅผ ์ธ๋ ๋ฑ ๋ฌธ์๋ณ๋ก ์ ๊ทผํ ๋์ String ๊ฐ์ฒด๊ฐ ํ์ํ๋ค. - ๋คํ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์๋ ๊ฐ์ ๋ณํ
Coerce
ํ๋ฏ๋ก ๋ช ์์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ผ์ ๊ฑฐ์ ์๋ค. ๋ฆฌํฐ๋ด ํ์์ ์ฌ์ฉํ๋ผ๊ณ ์ ๊ทน ๊ถ์ฅํ๋ค.
var strPrimitive = 'I am string!';
console.log( strPrimitive.length ); // 13
console.log( strPrimitive.charAt(3) ); // "m"
42.359.toFixed( 2 )
์ ๊ฐ์ด ์ซ์ ๋ฆฌํฐ๋ด 42์ ๋ฉ์๋๋ฅผ ํธ์ถํด๋new Number( 42 )
๊ฐ์ฒด ๋ํผ๋ก ๊ฐ์ ๋ณํ๋๊ณ ๋ถ๋ฆฌ์ธ ์์ ๊ฐ๋ Boolean ๊ฐ์ฒด๋ก ๋ฐ๋๋ค.- ๊ฐ์ฒด ๋ํผ ํ์์ด ์๋
null
๊ณผundefined
๋ ๊ทธ ์์ฒด๋ก ์ ์ผ ๊ฐ์ด๋ค. ๋ฐ๋๋กDate
๊ฐ์ ๋ฆฌํฐ๋ด ํ์์ด ์์ด์ ๋ฐ๋์ ์์ฑ์ ํ์์ผ๋ก ์์ฑํด์ผ ํ๋ค. Objects
,Arrays
,Functions
,RegExps
๋ ํ์(๋ฆฌํฐ๋ด/์์ฑ์)๊ณผ ๋ฌด๊ดํ๊ฒ ๋ชจ๋ ๊ฐ์ฒด๋ค.Error
๊ฐ์ฒด๋ ์์ธ๊ฐ ๋์ ธ์ง๋ฉด ์์์ ์์ฑ๋๋ ๋ช ์์ ์ผ๋ก ์์ฑํ ์ผ์ ๋๋ฌผ๋ค.
3.3 ๋ด์ฉ Contents
- ๊ฐ์ฒด๋ ํน์ ํ ์์น์ ํ๋กํผํฐ๋ก Contents๊ฐ ์ฑ์์ง๋ค.
3.3.1 ๊ณ์ฐ๋ ํ๋กํผํฐ๋ช
- ES6๋ถํฐ๋ ๊ณ์ฐ๋ ํ๋กํผํฐ๋ช
Computed Property Names
์ด๋ผ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋๋ฐ, ๊ฐ์ฒด ๋ฆฌํฐ๋ด ์ ์ธ ๊ตฌ๋ฌธ์ ํค ์ด๋ฆ ๋ถ๋ถ์ ํด๋น ํํ์์ ๋ฃ๊ณ[ ]
๋ก ๊ฐ์ธ๋ฉด ๋๋ค.
var prefix = "foo";
var myObject = {
[prefix + "bar"]: "hello",
[prefix + "baz"]: "world"
};
myObject["foobar"]; // hello
myObject["foobaz"]; // world
- ๊ณ์ฐ๋ ํ๋กํผํฐ๋ช ์ ES6 ์ฌ๋ณผ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ์ง ์์๊น ์ถ๋ค.
- ์ฌ๋ณผ์ ์๋ก์ด ์์ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ๋ถ๋ถ๋ช ํ๊ณ ์์ธก ๋ถ๊ฐ๋ฅํ ๊ฐ(๊ธฐ์ ์ ์ผ๋ก๋ ๋ฌธ์์ด ๊ฐ)์ ๊ฐ์ง๋ค. ์ฌ๋ณผ์ ์ค์ ๊ฐ(์ด๋ก ์ ์ผ๋ก๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง๋ง๋ค ์ ๊ฐ๊ฐ์ผ ์ ์๋ค)์ ์ง์ ๋ค๋ฃฐ ์ผ์ ๊ฑฐ์ ์์ผ๋ฏ๋ก Symbol.Something ๊ฐ์ ์ฌ๋ณผ๋ช ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
var myObject = {
[Symbol.Something]: "hello wolrd"
}
3.3.2 ํ๋กํผํฐ vs ๋ฉ์๋
- ํจ์๋ ๊ฒฐ์ฝ ๊ฐ์ฒด์ ์ํ๋ ๊ฒ์ด ์๋๋ฉฐ, ๊ฐ์ฒด ๋ ํผ๋ฐ์ค๋ก ์ ๊ทผํ ํจ์๋ฅผ ๊ทธ๋ฅ ๋ฉ์๋๋ผ ์นญํ๋ ๊ฑด ๊ทธ ์๋ฏธ๋ฅผ ์ง๋์น๊ฒ ํ๋ํด ํด์ํ ๊ฒ์ด๋ค.
3.3.3 ๋ฐฐ์ด
- ๋ฐฐ์ด์ ์ซ์ ์ธ๋ฑ์ฑ, ์ฆ ์ธ๋ฑ์ค๋ผ๋ ์์๋ก ํ๊ธฐ๋ ์์น์ ๊ฐ์ ์ ์ฅํ๋ค.
- ์ธ๋ฑ์ค๋ ์์์ง๋ง ๋ฐฐ์ด ์์ฒด๋ ๊ฐ์ฒด์ฌ์ ๋ฐฐ์ด์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
- ์ธ๋ฑ์ค๋ฅผ ์ฐ์ง ์๊ณ ์ผ๋ฐ์ ์ธ ํค/๊ฐ ๊ฐ์ฒด๋ก ๋ฐฐ์ด์ ์ฌ์ฉํ ์๋ ์์ง๋ง ์ข์ ์๊ฐ์ ์๋๋ค.
3.3.4 ๊ฐ์ฒด ๋ณต์ฌ
- ๊ฐ์ฒด ๋ณต์ฌ์๋ ์์ ๋ณต์ฌ
Shallow Copy
, ๊น์ ๋ณต์ฌDeep Copy
๊ฐ ์๋ค. - ์์ ๋ณต์ฌ๋ฅผ ํ ๊ฒฝ์ฐ ํํ ์ฐธ์กฐ
Circular Reference
ํํ๊ฐ ๋์ด ๋ฌดํ ๋ณต์ฌ์ ๊ตฌ๋ ํ ์ด์ ๋น ์ง ์ ์๋ค. - ๊น์ ๋ณต์ฌ ๋ฐฉ๋ฒ์ธ โJSON-Safe ๊ฐ์ฒดโ๋ ์ฝ๊ฒ ๋ณต์ฌํ ์ ์์ผ๋ฏ๋ก ํ๋์ ๋์์ด ๋ ์๋ ์๋ค.
- ํํธ, ์์ ๋ณต์ฌ๋ ์ดํดํ๊ธฐ ์ฝ๊ณ ๋ณ๋ค๋ฅธ ์ด์๊ฐ ์๊ธฐ์ ES6๋ถํฐ๋ Object.assign() ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
3.3.5 ํ๋กํผํฐ ์์ ์
- ES5๋ถํฐ ๋ชจ๋ ํ๋กํผํฐ๋ ํ๋กํผํฐ ์์ ์
Property Descriptor
๋ก ํํ๋๋ค.
var myObject = {
a: 2
};
Object.getOwnPropertyDescriptor( myObject, "a" );
// {
// value: 2,
// writable: true,
// enumerable: true,
// configurable: true
// }
- ํ๋ฒํ ๊ฐ์ฒด ํ๋กํผํฐ a์ ํ๋กํผํฐ ์์ ์(๋๋ ๋ฐ์ดํฐ ์์ ์)๋ฅผ ์กฐํํด๋ณด๋ writable, enumerable, configurable์ ์ธ ๊ฐ์ง ํน์ฑ์ด ๋ ์๋ค.
Object.defineProperty()
๋ก ์๋ก์ด ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ํ๋กํผํฐ์ ํน์ฑ์ ์์ ํ ์ ์๋ค.(configurable์ด true์ผ ๋๋ง ๊ฐ๋ฅ)
var myObject = {};
Object.defineProperty( myObject, "a", {
value: 2,
writable: true,
enumerable: true,
configurable: true
} );
myObject.a; // 2
- ์ฐ๊ธฐ๊ฐ๋ฅ/์ค์ ๊ฐ๋ฅ/์ด๊ฑฐ๊ฐ๋ฅ ํน์ฑ์ ๋ฐ๋ผ ํ๋กํผํฐ์ ์ฑ๊ฒฉ์ด ๋ฐ๋๋ค.
3.3.6 ๋ถ๋ณ์ฑ
- ํ๋กํผํฐ/๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋์ง ์๊ฒ ํด์ผ ํ ๊ฒฝ์ฐ ES5๋ถํฐ ์ด๋ฐ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ ์ ๊ณตํ์ง๋ง, ์์ ๋ถ๋ณ์ฑ
Shallow Immutability
๋ง ์ง์ํ๋ค. ์ฆ, ๊ฐ์ฒด ์์ ๊ณผ ์ง์ ํ๋กํผํฐ ํน์ฑ๋ง ๋ถ๋ณ์ผ๋ก ๋ง๋ค ๋ฟ ๋ค๋ฅธ ๊ฐ์ฒด(๋ฐฐ์ด, ๊ฐ์ฒด, ํจ์)๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ ํผ๋ฐ์ค๊ฐ ์์ ๋ ํด๋น ๊ฐ์ฒด์ ๋ด์ฉ๊น์ง ๋ถ๋ณ์ผ๋ก ๋ง๋ค์ง๋ ๋ชปํ๋ค.
myImmutableObject.foo; // [1,2,3]
myImmutableObject.foo.push( 4 );
myImmutableObject.foo; // [1,2,3,4]
- foo๋ฅผ ๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ฐ๊พธ๋ ค๋ฉด ์๋์ ๋ฐฉ๋ฒ์ด ์๋ค.
- ๊ฐ์ฒด ์์
writable:false
์configuration:false
๋ฅผ ๊ฐ์ด ์ฐ๋ฉด ํ๋กํผํฐ๋ฅผ ์์์ฒ๋ผ ์ธ ์ ์๋ค.
var myObject = {};
Object.defineProperty( myObject, "FAVORITE_NUMBER", {
value: 42,
writable: false,
configurable: false
});
- ํ์ฅ ๊ธ์ง
- ๊ฐ์ฒด์ ๋๋ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ ์ ์๊ฒ ์ฐจ๋จํ๊ณ ํ์ฌ ํ๋กํผํฐ๋ ์๋ ๊ทธ๋๋ก ๋๋๊ณ ์ถ์ ๋
Object.preventExtensions()
๋ฅผ ํธ์ถํ๋ค.
- ๊ฐ์ฒด์ ๋๋ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ ์ ์๊ฒ ์ฐจ๋จํ๊ณ ํ์ฌ ํ๋กํผํฐ๋ ์๋ ๊ทธ๋๋ก ๋๋๊ณ ์ถ์ ๋
var myObject = {
a: 2
};
Object.preventExtensions( myObject );
myObject.b = 3;
myObject.b; // undefined
- ๋น์๊ฒฉ ๋ชจ๋์์ ํ๋กํผํฐ b๋ฅผ ์ถ๊ฐํด๋ ์กฐ์ฉํ ์คํจํ๊ณ ์๊ฒฉ ๋ชจ๋์์๋ TypeError๊ฐ ๋ฐ์ํ๋ค.
- ๋ด์ธ
Object.seal()
๋ ๋ด์ธ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ฆ, ์ด๋ค ๊ฐ์ฒด์ ๋ํดObject.preventExtensions()
๋ฅผ ์คํํ๊ณ ํ๋กํผํฐ๋ฅผ ์ ๋ถconfigurable:false
์ฒ๋ฆฌํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ ์ ์๊ณ ๊ธฐ์กด ํ๋กํผํฐ๋ฅผ ์ฌ์ค์ ํ๊ฑฐ๋ ์ญ์ ํ ์๋ ์๋ค. ๋ฌผ๋ก ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค.
- ๋๊ฒฐ
Object.freeze()
๋ ๊ฐ์ฒด๋ฅผ ๊ฝ๊ฝ ์ผ๋ฆฐ๋ค. ์์์ ์ค๋ช ํ Object.seal()์ ์ ์ฉํ๊ณ โ๋ฐ์ดํฐ ์ ๊ทผ์Data Accessor
โ ํ๋กํผํฐ๋ฅผ ๋ชจ๋writable:false
์ฒ๋ฆฌํด์ ๊ฐ๋ ๋ชป ๋ฐ๊พธ๊ฒ ํ๋ค.- ๋๊ฒฐ์ ๊ฐ์ฅ ๋์ ๋จ๊ณ์ ๋ถ๋ณ์ฑ์ ์ ์ฉํ ๊ฒ์ผ๋ก ๊ฐ์ฒด์ ์ง์ ํ๋กํผํฐ์ ์ด๋ค ๋ณ๊ฒฝ๋ ์์ฒ ๋ด์ํ๋ค.
3.3.7 [[Get]]
- ํ๋กํผํฐ์ ์ ๊ทผํ๊ธฐ๊น์ง์ ์ธ๋ถ ๊ณผ์ ์ ๋ฏธ๋ฌํ๋ฉด์๋ ์ค์ํ๋ค.
var myObject = {
a: 2
};
myObject.a; // 2
- ๋ช ์ธ์ ๋ฐ๋ฅด๋ฉด ์ค์ ๋ก ์ด ์ฝ๋๋ myObject์ ๋ํด [[Get]] ์ฐ์ฐ์ ํ๋ค. ( [Get] ๊ฐ์ ํจ์ ํธ์ถ )
- ๊ธฐ๋ณธ์ผ๋ก [[Get]] ์ฐ์ฐ์ ์ฃผ์ด์ง ์ด๋ฆ์ ํ๋กํผํฐ๋ฅผ ๋จผ์ ์ฐพ์๋ณด๊ณ ์์ผ๋ฉด ๊ทธ ๊ฐ์ ๋ฐํํ๋ค. ํ๋กํผํฐ๋ฅผ ์ฐพ์๋ณด๊ณ ์์ผ๋ฉด [[Get]] ์ฐ์ฐ ์๊ณ ๋ฆฌ์ฆ์ [[Prototype]] ์ฐ์ ์ํ๋ฅผ ํ๊ฒ ๋๋ค.
- ์ฃผ์ด์ง ํ๋กํผํฐ ๊ฐ์ ์ด๋ป๊ฒ ํด๋ ์ฐพ์ ์ ์์ผ๋ฉด [[Get]] ์ฐ์ฐ์ undefined๋ฅผ ๋ฐํํ๋ค.
var myObject = {
a: 2
};
myObject.b; // undefined
- ์๋ณ์๋ช ์ผ๋ก ๋ณ์๋ฅผ ์ฐธ์กฐํ ๋ ์๋ ๋ฐฉ์์ด ๋ค๋ฅด๋ค. ํด๋นํ๋ ๋ ์์ปฌ ์ค์ฝํ ๋ด์ ์๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ฉด ๊ฐ์ฒด ํ๋กํผํฐ์ฒ๋ผ undefined๊ฐ ๋ฐํ๋์ง ์๊ณ ReferenceError๊ฐ ๋ฐ์ํ๋ค.
var myObject = {
a: undefined
};
myObject.a; // undefined
myObject.b; // undefined
- ๊ฐ๋ง ๋ด์๋ ๋ ๋ค undefined๋ผ ๋ถ์ฐ์ด ์ ๋๋ค. ํ์ง๋ง ๋ด๋ถ์ ์ผ๋ก [[Get]] ์ฐ์ฐ์ ์ํํ ํ ๋ ๋์ฒด๋ก myObject.b๊ฐ myObject.a๋ณด๋ค โ๋ ์ผ์ ๋ง์ด ํ๋คโ๊ณ ๋ณผ ์ ์๋ค. ์ด๋ฅผ ๊ตฌ๋ถํ๋ ค๋ฉด hasOwnProperty ๋ฉ์๋๋ฅผ ํตํด ์ ์ ์๋ค.
3.3.8 [[Put]]
- ์ธ๋ป ๋ณด๊ธฐ์ ๊ฐ์ฒด ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํ๋ ์ผ์ ๊ทธ์ [[Put]]์ ํธ์ถํ์ฌ ์ฃผ์ด์ง ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ธํ /์์ฑํ๋ ์ผ์ด ์ ๋ถ์ผ ๋ฏ์ถ์ง๋ง ์ค์ ๋ก๋ ์ข ๋ณต์กํ๋ค.
- [[Put]]์ ์คํํ๋ฉด ์ฃผ์ด์ง ๊ฐ์ฒด์ ํ๋กํผํฐ๊ฐ ์กด์ฌํ๋์ง ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ์์์ ๋ฐ๋ผ ์ดํ ์๋ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ค. [[Put]] ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฏธ ์กด์ฌํ๋ ํ๋กํผํฐ์ ๋ํด ๋๋ต ๋ค์์ ํ์ธ ์ ์ฐจ๋ฅผ ๋ฐ๋๋ค.
- ํ๋กํผํฐ๊ฐ ์ ๊ทผ ์์ ์
Accessor Descriptor
์ธ๊ฐ? ๋ง์ผ๋ฉด ์ธํฐ๋ฅผ ํธ์ถํ๋ค. - ํ๋กํผํฐ๊ฐ writable:false์ธ ๋ฐ์ดํฐ ์์ ์ฌ
Data Descriptor
์ธ๊ฐ? ๋ง์ผ๋ฉด ๋น์๊ฒฉ ๋ชจ๋์์ ์กฐ์ฉํ ์คํจํ๊ณ ์๊ฒฉ ๋ชจ๋๋ TypeError๊ฐ ๋ฐ์ํ๋ค. - ์ด์ธ์๋ ํ๋กํผํฐ์ ํด๋น ๊ฐ์ ์ธํ ํ๋ค.
- ํ๋กํผํฐ๊ฐ ์ ๊ทผ ์์ ์
- ๊ฐ์ฒด์ ์กด์ฌํ์ง ์๋ ํ๋กํผํฐ๋ผ๋ฉด [[Put]] ์๊ณ ๋ฆฌ์ฆ์ ํจ์ฌ ๋ ๋ฏธ๋ฌํ๊ณ ๋ณต์กํด์ง๋ค.
3.3.9 ๊ฒํฐ์ ์ธํฐ
- [[Put]]๊ณผ [[Get]] ๊ธฐ๋ณธ ์ฐ์ฐ์ ์ด๋ฏธ ์กด์ฌํ๊ฑฐ๋ ์ ํ ์๋ก์ด ํ๋กํผํฐ์ ๊ฐ์ ์ธํ ํ๊ฑฐ๋ ๊ธฐ์กด ํ๋กํผํฐ๋ก๋ถํฐ ๊ฐ์ ์กฐํํ๋ ์ญํ ์ ๊ฐ๊ฐ ๋ด๋นํ๋ค.
- ES5๋ถํฐ๋ ๊ฒํฐ/์ธํฐ๋ฅผ ํตํด (๊ฐ์ฒด ์์ค์ด ์๋) ํ๋กํผํฐ ์์ค์์ ์ด๋ฌํ ๊ธฐ๋ณธ ๋ก์ง์ ์ค๋ฒ๋ผ์ด๋ํ ์ ์๋ค. ๊ฒํฐ/์ธํฐ๋ ๊ฐ๊ฐ ์ค์ ๋ก ๊ฐ์ ๊ฐ์ ธ์ค๋/์ธํ ํ๋ ๊ฐ์ถฐ์ง ํจ์๋ฅผ ํธ์ถํ๋ ํ๋กํผํฐ๋ค.
- ํ๋กํผํฐ๊ฐ ๊ฒํฐ ๋๋ ์ธํฐ ์ด๋ ํ์ชฝ์ด๊ฑฐ๋ ๋์์ ๊ฒํฐ/์ธํฐ๊ฐ ๋ ์ ์๊ฒ ์ ์ํ ๊ฒ์(โ๋ฐ์ดํฐ ์์ ์โ์ ๋ฐ๋๋ง๋ก) โ์ ๊ทผ ์์ ์
Accessor Description
โ๋ผ๊ณ ํ๋ค. ์ ๊ทผ ์์ ์์์๋ ํ๋กํผํฐ์ ๊ฐ๊ณผ writable ์์ฑ์ ๋ฌด์๋๋ฉฐ ๋์ (configurable, enumerable๊ณผ ๋๋ถ์ด) ํ๋กํผํฐ์ ๊ฒGet
/์ Set
์์ฑ์ด ์ค์ํ๋ค.
var myObject = {
// 'a'์ ๊ฒํฐ๋ฅผ ์ ์ํ๋ค.
get a() {
return 2;
}
};
Object.defineProperty(
myObject, // ํ๊น
"b", // ํ๋กํผํฐ๋ช
{ // ์์ ์
// 'b'์ ๊ฒํฐ๋ฅผ ์ ์ํ๋ค.
get: function(){ return this.a * 2 },
// 'b'๊ฐ ๊ฐ์ฒด ํ๋กํผํฐ๋ก ํ์คํ ํ์๋๊ฒ ํ๋ค.
enumerable: true
}
);
myObject.a; // 2
myObject.b; // 4
- get a() {} ์ฒ๋ผ ๋ฆฌํฐ๋ด ๊ตฌ๋ฌธ์ผ๋ก ๊ธฐ์ ํ๋ , defineProperty()๋ก ๋ช ์์ ์ ์๋ฅผ ๋ด๋ฆฌ๋ ์ค์ ๋ก ๊ฐ์ ๊ฐ์ง๊ณ ์์ง ์์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์์ฑํ๋ ๊ฑด ๊ฐ์ง๋ง ํ๋กํผํฐ์ ์ ๊ทผํ๋ฉด ์๋์ผ๋ก ๊ฒํฐ ํจ์๋ฅผ ์๋ฐํ๊ฒ ํธ์ถํ์ฌ ์ด๋ค ๊ฐ์ด๋ผ๋ ๊ฒํฐ ํจ์๊ฐ ๋ฐํํ ๊ฐ์ด ๊ฒฐ๊ด๊ฐ์ด ๋๋ค.
var myObject = {
// 'a'์ ๊ฒํฐ๋ฅผ ์ ์ํ๋ค.
get a() {
return 2;
}
};
myObject.a = 3;
myObject.a; // 2
- a์ ๊ฒํฐ๊ฐ ์ ์๋์ด ์์ผ๋ฏ๋ก ํ ๋น๋ฌธ์ผ๋ก ๊ฐ์ ์ธํ
ํ๋ ค๊ณ ํ๋ฉด ์๋ฌ ์์ด ์กฐ์ฉํ ๋ฌด์๋๋ค. ์ธํฐ๊ฐ ์์ด๋ ์ปค์คํ
Custom
๊ฒํฐ๊ฐ 2๋ง ๋ฐํํ๊ฒ ํ๋ ์ฝ๋ฉ๋์ด ์์ด์ ์ธํ ์ ์์ผ๋ ๋ง๋๋ค. - ํ๋กํผํฐ ๋จ์๋ก ๊ธฐ๋ณธ [[Put]] ์ฐ์ฐ(ํ ๋น)์ ์ค๋ฒ๋ผ์ด๋ํ๋ ์ธํฐ๊ฐ ์ ์๋์ด์ผ ํ๋ค. ๊ฒํฐ์ ์ธํฐ๋ ํญ์ ๋ ๋ค ์ ์ธํ๋ ๊ฒ์ด ์ข๋ค(ํ์ชฝ๋ง ์ ์ธํ๋ฉด ์์์ธ์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ค.
var myObject = {
// 'a'์ ๊ฒํฐ๋ฅผ ์ ์ํ๋ค.
get a() {
return this._a_;
},
set a(val) {
this._a_ = val * 2;
}
};
myObject.a = 2;
myObject.a; // 4
- ์์ ์์ ์ฃผ์ด์ง ๊ฐ 2๋ ์ค์ ๋ก ๋ค๋ฅธ ๋ณ์
_a_
์ ํ ๋น([[Put]]์ฐ์ฐ)ํ๋ค._a_
๋ผ๋ ๋ช ์นญ์ ์์ ํ ๊ด๋ก์ ๋ถ์ธ ๊ฒ์ด๊ณ ๋ก์ง๊ณผ๋ ์ ํ ๋ฌด๊ดํ ์ผ๋ฐ ํ๋กํผํฐ๋ค.
3.3.10 ์กด์ฌ ํ์ธ
- ๊ฐ์ฒด์ ์ด๋ค ํ๋กํผํฐ๊ฐ ์กด์ฌํ๋์ง๋ ๊ตณ์ด ํ๋กํผํฐ ๊ฐ์ ์ป์ง ์๊ณ ๋ ํ์ธํ ์ ์๋ค.
var myObject = {
a: 2
};
("a" in myObject); // true
("b" in myObject); // false
myObject.hasOwnProperty( "a" ); // true
myObject.hasOwnProperty( "b" ); // false
in
์ฐ์ฐ์๋ ์ด๋ค ํ๋กํผํฐ๊ฐ ํด๋น ๊ฐ์ฒด์ ์กด์ฌํ๋์ง ์๋๋ฉด ์ด ๊ฐ์ฒด์ [[Prototype]] ์ฐ์๋ฅผ ๋ฐ๋ผ๊ฐ์ ๋ ์์ ๋จ๊ณ์ ์กด์ฌํ๋์ง ํ์ธํ๋ค. ์ด์ ๋ฌ๋ฆฌhasOwnProperty()
๋ ๋จ์ง ํ๋กํผํฐ๊ฐ ๊ฐ์ฒด์ ์๋์ง๋ง ํ์ธํ๊ณ [[Prototype]] ์ฐ์๋ ์ฐพ์ง ์๋๋ค.- ๊ฑฐ์ ๋ชจ๋ ์ผ๋ฐ ๊ฐ์ฒด๋ Object.prototype ์์์ ํตํด hasOwnProperty()์ ์ ๊ทผํ ์ ์์ง๋ง ๊ฐํน (Object.create(null)) Object.prototype๊ณผ ์ฐ๊ฒฐ๋์ง ์์ ๊ฐ์ฒด๋ myObject.hasOwnProperty() ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
- ์ด๋ด ๊ฒฝ์ฐ์ Object.prototype.hasOwnProperty.call(myObject, โaโ) ์ฒ๋ผ ๊ธฐ๋ณธ hasOwnProperty() ๋ฉ์๋๋ฅผ ๋น๋ ค์ myObject์ ๋ํด ๋ช ์์ ์ผ๋ก ๋ฐ์ธ๋ฉํ๋ฉด ์ข ๋ ํ์คํ๊ฒ ํ์ธํ ์ ์๋ค.
์ด๊ฑฐ
- ํ๋กํผํฐ ์์ ์ ์์ฑ ์ค ํ๋์ธ enumerable์ โ์ด๊ฑฐ ๊ฐ๋ฅ์ฑโ ๊ฐ๋ ์ผ๋ก ์ข ๋ ์์ธํ ์ดํด๋ณด์.
var = myObject = {};
Object.defineProperty(
myObject,
"a",
// 'a'๋ฅผ ์ด๊ฑฐ๊ฐ ๊ฐ๋ฅํ๊ฒ ์ธํ
ํ๋ค(๊ธฐ๋ณธ๊ฐ)
{ enumerable: true, value: 2 }
);
Object.defineProperty(
myObject,
"b",
// 'b'๋ฅผ ์ด๊ฑฐ๊ฐ ๋ถ๊ฐ๋ฅํ๊ฒ ์ธํ
ํ๋ค.
{ enumerable: false, value: 3 }
);
myObject.b; // 3
("b" in myObject); // true
myObject.hasOwnProperty( "b" ); // true
// ...
for (var k in myObject) {
console.log( k, myObject[k] );
}
// "a" 2
- myObject.b๋ ์ค์ ์กด์ฌํ๋ ํ๋กํผํฐ๋ก ๊ทธ ๊ฐ์๋ ์ ๊ทผํ ์ ์์ง๋ง, forโฆin ๋ฃจํ์์๋ ์์ทจ๋ฅผ ๊ฐ์ถฐ๋ฒ๋ฆฐ๋ค. ์ด์ฒ๋ผ โ์ด๊ฑฐ ๊ฐ๋ฅ
Enumerable
โ ํ๋ค๋ ๊ฑด ๊ธฐ๋ณธ์ ์ผ๋ก โ๊ฐ์ฒด ํ๋กํผํฐ ์ํ ๋ฆฌ์คํธ์ ํฌํจโ๋๋ค๋ ๋ป์ด๋ค. - ํ๋กํผํฐ๊ฐ ์ด๊ฑฐ ๊ฐ๋ฅํ์ง๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ํ์ธํ ์ ์๋ค.
var = myObject = {};
Object.defineProperty(
myObject,
"a",
// 'a'๋ฅผ ์ด๊ฑฐ๊ฐ ๊ฐ๋ฅํ๊ฒ ์ธํ
ํ๋ค(๊ธฐ๋ณธ๊ฐ)
{ enumerable: true, value: 2 }
);
Object.defineProperty(
myObject,
"b",
// 'b'๋ฅผ ์ด๊ฑฐ๊ฐ ๋ถ๊ฐ๋ฅํ๊ฒ ์ธํ
ํ๋ค.
{ enumerable: false, value: 3 }
);
myObject.propertyIsEnumerable( "a" ); // true
myObject.propertyIsEnumerable( "b" ); // false
Object.key( myObject ); // ["a"]
Object.getOwnPropertyNames( myObject ); // ["a", "b"]
propertyIsEnumerable()
์ ์ด๋ค ํ๋กํผํฐ๊ฐ ํด๋น ๊ฐ์ฒด์ ์ง์ ํ๋กํผํฐ์ธ ๋์์ enumerable:true์ธ์ง ๊ฒ์ฌํ๋ค. Object.key()๋ Object.getOwnPropertyNames()์ ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ์ ์๊ด์์ด ๊ฐ์ฒด์ ์๋ ๋ชจ๋ ์ด๊ฑฐ ๊ฐ๋ฅํ ํ๋กํผํฐ๋ฅผ ๋ฐฐ์ด ํํ๋ก ๋ฐํํ๋ค.- in๊ณผ hasOwnProprerty()๊ฐ [[Prototype]] ์ฐ์์ ํ์ธ์ ๋ฐ๋ผ ์ฐจ์ด๊ฐ ์๋ ๋ฐ๋ฉด, Object.keys()์ Object.getOwnProertyNames()๋ ๋ชจ๋ ์ฃผ์ด์ง ๊ฐ์ฒด๋ง ํ์ธํ๋ค.
- in ์ฐ์ฐ์์ ๊ฒฐ๊ณผ๊ฐ ๋๋ฑํ ํ๋กํผํฐ ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ์กฐํํ๋ ๊ธฐ๋ฅ์ (์ง๊ธ์) ์๋ค. ๋จ๊ณ๋ง๋ค Object.keys()์์ ์ด๊ฑฐ ๊ฐ๋ฅํ ํ๋กํผํฐ ๋ฆฌ์คํธ๋ฅผ ํฌ์ฐฉํ์ฌ ์ฌ๊ท์ ์ผ๋ก ์ฃผ์ด์ง ๊ฐ์ฒด์ [[Property]] ์ฐ์๋ฅผ ์ํํ๋ ์์ ๋ก์ง์ ๊ตฌํํ์ฌ ๋๋ต ๋น์ทํ ์ ํธ๋ฆฌํฐ๋ฅผ ๋ง๋ค์ด ์ฐ๋ฉด ๋๋ค.
3.4 ์ํ
- forโฆin ๋ฃจํ๋ ์ด๊ฑฐ ๊ฐ๋ฅํ ๊ฐ์ฒด ํ๋กํผํฐ๋ฅผ ([[Prototype]] ์ฐ์๋ ํฌํจํ์ฌ) ์ฐจ๋ก๋ก ์ํํ๋ค.
- ํ๋กํผํฐ ๊ฐ์ ์ํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํ ๊น? ๋ค์ ์ฝ๋๋ฅผ ๋ณด์.
var myArray = [1,2,3];
for (var i = 0; i < myArray.length; i ++) {
console.log( myArray[i] );
}
// 1 2 3
- ์ด ์ฝ๋๋ ์ธ๋ฑ์ค๋ฅผ ์ํํ๋ฉด์ ํด๋น ๊ฐ(myArray[i])์ ์ฌ์ฉํ ๋ฟ ๊ฐ ์์ฒด๋ฅผ ์ํํ๋ ๊ฒ์ ์๋๋ค.
- ES5๋ถํฐ๋ forEach(), every(), some() ๋ฑ์ ๋ฐฐ์ด ๊ด๋ จ ์ํ ํฌํผ๊ฐ ๋์ ๋๋ค. ์ด ํจ์๋ค์ ๋ฐฐ์ด์ ๊ฐ ์์์ ์ ์ฉํ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ผ๋ฉฐ, ์์๋ณ๋ก ๋ฐํ ๊ฐ์ ์ฒ๋ฆฌํ๋ ๋ก์ง๋ง ๋ค๋ฅด๋ค.
- forEach()๋ ๋ฐฐ์ด ์ ์ฒด ๊ฐ์ ์ํํ์ง๋ง ์ฝ๋ฐฑ ํจ์์ ๋ฐํ ๊ฐ์ ๋ฌด์ํ๋ค.
- every()๋ ๋ฐฐ์ด ๋๊น์ง ๋๋ ์ฝ๋ฐฑ ํจ์๊ฐ false(๋๋ โfalsyโ๊ฐ)๋ฅผ ๋ฐํํ ๋๊น์ง ์ํํ๋ฉฐ some()์ ์ด์ ์ ๋ฐ๋๋ก ๋ฐฐ์ด ๋๊น์ง ๋๋ ์ฝ๋ฐฑ ํจ์๊ฐ true(๋๋ โtruthyโ๊ฐ)๋ฅผ ๋ฐํํ ๋๊น์ง ์ํํ๋ค. every()์ some()์ ์ด๋ฌํ ํน๋ณํ ๋ฐํ ๊ฐ์ ์ผ๋ฐ์ ์ธ for ๋ฃจํ์ break๋ฌธ์ฒ๋ผ ๋๊น์ง ์ํํ๊ธฐ ์ ์ ์ผ์ฐ๊ฐ์น ์ํ๋ฅผ ๋๋ด๋ ๋ฐ ์ฐ์ธ๋ค.
- forโฆin ๋ฃจํ๋ฅผ ์ด์ฉํ ๊ฐ์ฒด ์ํ๋ ์ค์ ๋ก ์ด๊ฑฐ ๊ฐ๋ฅํ ํ๋กํผํฐ๋ง ์ํํ๊ณ ๊ทธ ๊ฐ์ ์ป์ผ๋ ค๋ฉด ์ผ์ผ์ด ํ๋กํผํฐ์ ์ ๊ทผํด์ผ ํ๋ฏ๋ก ๊ฐ์ ์ ์ธ ๊ฐ ์ถ์ถ์ด๋ค.
- ๋ฐฐ์ด ์ธ๋ฑ์ค(๋ ๊ฐ์ฒด ํ๋กํผํฐ)๊ฐ ์๋ ๊ฐ์ ์ง์ ์ํํ๊ธฐ ์ํด ES6๋ถํฐ ๋ฐฐ์ด(์์ฒด ์ปค์คํ ์ํ์๊ฐ ์ ์๋ ๊ฐ์ฒด) ์ํ์ฉ forโฆof ๊ตฌ๋ฌธ์ ์ ๊ณตํ๋ค.
var myArray = [ 1,2,3 ];
for (var v of myArray) {
console.log( v );
}
// 1
// 2
// 3
- forโฆof ๋ฃจํ๋ ์ํํ ์์์ ์ํ์ ๊ฐ์ฒด
Iterator Object
(๋ช ์ธ์์ผ๋ก ๋งํ๋ฉด @@iterator๋ผ๋ ๊ธฐ๋ณธ ๋ด๋ถ ํจ์)๊ฐ ์์ด์ผ ํ๋ค. ์ํ๋น ํ ๋ฒ์ฉ ์ด ์ํ์ ๊ฐ์ฒด์ next() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ฐ์์ ์ผ๋ก ๋ฐํ ๊ฐ์ ์ํํ๋ค. - ๋ฐฐ์ด์ @@iterator๊ฐ ๋ด์ฅ๋ ๋๋ถ์ ๋ค์ ์์ ์์ ๋ณด๋ค์ํผ ์์ฝ๊ฒ forโฆof ๋ฃจํ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ด์ฅ @@iterator๋ฅผ ์ด์ฉํ์ฌ ์๋์ผ๋ก ๋ฐฐ์ด์ ์ํํ๋ฉด์ ์๋ ์๋ฆฌ๋ฅผ ์ดํด๋ณด์.
var myArray = [ 1,2,3 ]l
var it = myArray[Symbol.iterator]();
it.next(); // { value:1, done:false }
it.next(); // { value:2, done:false }
it.next(); // { value:3, done:false }
it.next(); // { done:true }
- ์ํ์์ next()๋ฅผ ํธ์ถํ ๊ฒฐ๊ด๊ฐ์ { value: , done: } ํํ์ ๊ฐ์ฒด๋ก, ์ฌ๊ธฐ์ value๋ ํ์ฌ ์ํ ๊ฐ, done์ ๋ค์์ ์ํํ ๊ฐ์ ์ ๋ฌด๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ด๋ค.
- 3์ด ๋ฐํ๋๋๋ฐ๋ done: false์ธ ๊ฒ์ ES6 ์ ๋๋ ์ดํฐ
Generator
ํจ์์ ์๋ฏธ ๋๋ฌธ์ด๋ค. - ๋ฐฐ์ด์ forโฆof ๋ฃจํ ๋ด์์ ์์์ ์ํํ์ง๋ง, ์ผ๋ฐ ๊ฐ์ฒด๋ ๋ด๋ถ์ @@iterator๊ฐ ์๋ค. ES6์์ @@iterator๋ฅผ ์๋์ ์ผ๋ก ๋๋ฝ์ํจ ์ด์ ๋ ์์ผ๋ก ๋ฑ์ฅํ ์๋ก์ด ํ์ ์ ๊ฐ์ฒด์์ ๋ฌธ์ ์ ์์ง๊ฐ ๋ ์ ์๋๋ ์ ์ ์๊ฐํด๋ณด๋ฉด ์ฐจ๋ผ๋ฆฌ ๋คํ์ค๋ฌ์ด ์ผ์ธ ๊ฒ ๊ฐ๋ค.
- ์ํํ๋ ค๋ ๊ฐ์ฒด์ ๊ธฐ๋ณธ @@iterator๋ฅผ ์์ ์ ์ํ ์๋ ์๋ค. ๋ค์ ์์ ๋ฅผ ๋ณด์.
var myObject = {
a: 2,
b: 3
};
Object.definePropery( myObject, Symbol.iterator, {
enumerable: false,
writable: false,
configurable: true,
value: function() {
var o = this;
var idx = 0;
var ks = Object.keys( o );
return {
next: function() {
return {
return {
value: o[ks[idx++]],
done: (idx > ks.length)
}
};
}
};
}
});
// myObject๋ฅผ ์๋์ผ๋ก ์ํํ๋ค.
var it = myObject[Symbol.iterator]();
it.next(); // { value:2, done:false }
it.next(); // { value:3, done:false }
it.next(); // { value:undefined, done:false }
// myObject๋ฅผ 'for...of' ๋ฃจํ๋ก ์ํํ๋ค.
for (var v of myObject) {
console.log( v );
}
// 2
// 3
- ์์ ์ฝ๋์์ ๋จ์ํ ๊ฐ ๋ ๊ฐ์ผ๋ก ์ํํ๊ณ ์์ง๋ง ํ์์ ๋ฐ๋ผ ์ฌ์ฉ์ ์๋ฃ ๊ตฌ์กฐ์ ๋ฑ ๋ง๋ ์์์ ๋ณต์กํ ์ํ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํ ์๋ ์๋ค. ES6์ forโฆof ๋ฃจํ์ ์ปค์คํ
์ํ์๋ ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ฅผ ์กฐ์ํ๋ ๋ฐ ์์ฃผ ํ์ํ ์๋ก์ด ๊ตฌ๋ฌธ ๋๊ตฌ
Syntactic Tool
๋ค.