Chapter 3: Objects - hochan222/Everything-in-JavaScript GitHub Wiki
Chapter 3: Objects
this ๋ฐ์ธ๋ฉ์์ ๊ทธ ์ค์ฌ์ ๊ฐ์ฒด๊ฐ ์์๋ค. ๊ฐ์ฒด๋ ๋ฌด์์ธ๊ฐ ์์๋ณด์.
Syntax
๊ฐ์ฒด๋ ๋๊ฐ์ง ํํ๋ก ์ ๊ณต๋๋ค. (๋ฆฌํฐ๋ด, ์์ฑ๋ ํผ)
literal syntax
var myObj = {
key: value
// ...
};
constructed form
var myObj = new Object();
myObj.key = value;
๋ ๊ฐ์ง ๋ฐฉ์์ ํ์คํ๊ฒ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ ์ผํ ์ฐจ์ด์ ์ ๋ฆฌํฐ๋ด์ ์ด๊ธฐํ์ ํค, ๊ฐ์ผ๋ก ํ๋ฒ์ ํด์ค ์ ์์ง๋ง constructed form์ ํ๋ํ๋ ์ถ๊ฐํด์ฃผ์ด์ผํ๋ค.
Type
๊ฐ์ฒด๋ JS์์ 6๊ฐ์ง primitive value์ค ํ๋๋ค.
string
number
boolean
null
undefined
object
primitive value๋ ๊ทธ ์์ฒด๊ฐ object๋ ์๋๋ค. null๊ฐ์ ๊ฒฝ์ฐ ์ธ์ด์ ์ค์๋ก typeof๋ฅผ ์ถ๋ ฅํ๋ฉด object๊ฐ ๋์ค์ง๋ง ๊ฐ์ฒด๋ ์๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ๊ฒ์ ๊ฐ์ฒด๋ผ๋ ๋ง์ ์๋ชป๋ ์์ ์ด๋ค.
๋ฐ๋ฉด, complex primitives๋ผ๊ณ ๋ถ๋ผ๋ sub-type ๊ฐ์ฒด๋ค์ด ์๋ค.
ํจ์๋ ๊ฐ์ฒด์ ํ์ ์ ํ์ด๋ค. ("callable object") ํจ์๋ ํธ์ถ ๊ฐ๋ฅํ ๋์์ด ์ฐ๊ฒฐ๋์ ๋ฟ ์ผ๋ฐ ๊ฐ์ฒด์ผ ๋ฟ์ด๋ฏ๋ก "first class"๋ผ๊ณ ํ๋ค.
๋ฐฐ์ด ์ญ์ ์ถ๊ฐ ๋์์ด์๋ ๊ฐ์ฒด์ด๋ค. ๋ฐฐ์ด์ ๋ด๋ถ ๊ตฌ์กฐ๋ ๊ฐ์ฒด๋ณด๋ค ์ฝ๊ฐ ๋ ๊ตฌ์กฐํ ๋ผ์๋ค.
Built-in Objects
์ผ๋ฐ์ ์ผ๋ก ๋ด์ฅ ๊ฐ์ฒด๋ผ๊ณ ํ๋ object sub-types๋ค์ด ์๋ค.
String
Number
Boolean
Object
Function
Array
Date
RegExp
Error
๋ค๋ฅธ ์ธ์ด๋ก ๋ฏธ๋ค๋ดค์ ๋ ์ด๊ฒ๋ค์ ์๋ฅผ๋ค์ด String class๋ก ๋ณด์ผ ์ ์์ง๋ง JS์์๋ ๊ทธ๋ฅ ํจ์์ผ ๋ฟ์ด๋ค.
var strPrimitive = "I am a string";
typeof strPrimitive; // "string"
strPrimitive instanceof String; // false
var strObject = new String( "I am a string" );
typeof strObject; // "object"
strObject instanceof String; // true
// inspect the object sub-type
Object.prototype.toString.call( strObject ); // [object String]
strPrimitive๋ ๊ฐ์ฒด๊ฐ ์๋๊ณ ๊ธฐ๋ณธ ๋ฆฌํฐ๋ด์ด๋ค.
๊ธธ์ด ํ์ธ, ๊ฐ๋ณ ๋ฌธ์ ์ ๊ทผ๋ฑ๊ณผ ๊ฐ์ ์์
์ ์ํํ๋ ค๋ฉด String ๊ฐ์ฒด๊ฐ ํ์ํ๋ค.
์ด์ข๊ฒ๋ JS๋ string primitive value๋ฅผ String ๊ฐ์ฒด๋ก ๊ฐ์ ํ๋ณํ์ ์์ผ์ค๋ค. JS ์ปค๋ฎค๋ํฐ์์๋ String ๊ฐ์ฒด๋ฅผ ๋ช ์์ ์ผ๋ก ์์ฑํ๋ ๊ฒ๋ณด๋ค๋ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๋๊ฒ์ ๊ฐ๋ ฅํ๊ฒ ์ถ์ฒํ๋ค.
var strPrimitive = "I am a string";
console.log( strPrimitive.length ); // 13
console.log( strPrimitive.charAt( 3 ) ); // "m"
์์ง์ด ์๋์ผ๋ก ํ๋ณํ ํด์ค๋ค!
42.359.toFixed(2)๋ ๊ฐ์ ๊ฒฝ์ฐ์ด๋ฉฐ Boolean๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
null, undefined๋ ๊ฐ์ฒด ๋ํผ๋ ์๊ณ ๊ธฐ๋ณธ ๊ฐ๋ง ์๋ค. ๋ฐ๋ฉด์, ๋ ์ง ํผ์ ๋ฆฌํฐ๋ด์ด ์์ผ๋ฏ๋ก ๊ฐ์ฒด ํ์์ผ๋ก๋ง ๋ง๋ค ์ ์๋ค.
Object, Array, Function, RegExp๋ ๋ชจ๋ ์ฌ์ฉ ํ์๊ณผ๋ ๊ด๋ จ์์ด ๋ชจ๋ ๊ฐ์ฒด์ด๋ค.
Contents
๊ฐ์ฒด์ ๊ฐ๋ค์ properties๋ผ ๋ถ๋ฅด๋ locations์ ์ ์ฅ์ด๋๋ค.
์์ง ๊ตฌํ๋ง๋ค ๋ค ๋ค๋ฅผ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์ปจํ ์ด๋์ ์ ์ฅ๋๋ ๊ฒ๋ค์ ๊ฐ์ฒด ์ ์ฅ ์์น์ ํฌ์ธํฐ๋ค์ธ property ์ด๋ฆ๋ค์ด๋ค.
var myObject = {
a: 2
};
myObject.a; // 2
myObject["a"]; // 2
myObject์์ location a์ ์ ๊ทผํ๊ธฐ ์ํด .
, []
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค. .a
๋ฌธ๋ฒ์ ํํ ํ๋กํผํฐ์ ์ ๊ทผํ๊ธฐ ์ํด ์ฌ์ฉํ๊ณ , ```["a"]๋ฌธ๋ฒ์ "key"์ ์ ๊ทผํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. ์ฌ์ค ๋๋ค ๋์ผํ๋ค.
var wantA = true;
var myObject = {
a: 2
};
var idx;
if (wantA) {
idx = "a";
}
// later
console.log( myObject[idx] ); // 2
๊ฐ์ฒด์์ ์์ฑ์ ์ด๋ฆ์ ํญ์ ๋ฌธ์์ด์ด๋ค. ๋ง์ฝ ๋ค๋ฅธ ๊ฐ์ ์ฌ์ฉํ๋ฉด ๋ฌธ์์ด๋ก ๋ณํ๋๋ค.
var myObject = { };
myObject[true] = "foo";
myObject[3] = "bar";
myObject[myObject] = "baz";
myObject["true"]; // "foo"
myObject["3"]; // "bar"
myObject["[object Object]"]; // "baz"
Computed Property Names
๋ค์๊ณผ ๊ฐ์ ํํ๋ ๊ฐ๋ฅํ๋ค.
var prefix = "foo";
var myObject = {
[prefix + "bar"]: "hello",
[prefix + "baz"]: "world"
};
myObject["foobar"]; // hello
myObject["foobaz"]; // world
computed property names์ ๋ณดํต ์ฌ์ฉ์ฒ๋ ES6์ Symbol์ธ๋ฐ ์์ง๋ง๋ค Symbol์ ๊ฐ์ด ๋ค๋ฅผ ์ ์๋ค. ๊ทธ๊ฒ์ ๊ธฐ์ ์ ์ผ๋ก๋ ๋ฌธ์์ด์ธ ์ถ์ธกํ ์ ์๋ ๊ฐ์ ๊ฐ๋ primitive value์ด๋ค.
var myObject = {
[Symbol.Something]: "hello world"
};
Property vs. Method
ํํ ๊ฐ๋ฐ์๋ค์ ์ด ๋์ ๊ตฌ๋ถํ๊ธธ ์ํ๋ค. ํ์ง๋ง JS specification์ ์ด ๋ ๋จ์ด๋ฅผ ๋์ผํ๊ฒ ๋ง๋ ๋ค.
function foo() {
console.log( "foo" );
}
var someFoo = foo; // variable reference to `foo`
var myObject = {
someFoo: foo
};
foo; // function foo(){..}
someFoo; // function foo(){..}
myObject.someFoo; // function foo(){..}
var myObject = {
foo: function foo() {
console.log( "foo" );
}
};
var someFoo = myObject.foo;
someFoo; // function foo(){..}
myObject.foo; // function foo(){..}
Arrays
๋ฐฐ์ด๋ [] ์ฐ์ฐ์๋ก ์ ๊ทผ์ ํ๊ณ ์กฐ๊ธ ๋ ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ค.
var myArray = [ "foo", 42, "bar" ];
myArray.length; // 3
myArray[0]; // "foo"
myArray[2]; // "bar"
var myArray = [ "foo", 42, "bar" ];
myArray.baz = "baz";
myArray.length; // 3
myArray.baz; // "baz"
. ๋๋ [] ์ฐ์ฐ์ ๊ตฌ๋ฌธ์ ๊ด๊ณ์์ด ๋ช
๋ช
๋ ์์ฑ์ ์ถ๊ฐํด๋ ๋ฐฐ์ด ๊ธธ์ด๋ ๋ณํ์ง ์๋๋ค.
ํ์ง๋ง ๋ฐฐ์ด์ด๋ ๋ฐฐ์ด์ ๋ง๋ ์๋์ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์ด์ ์ฌ์ฉ์ ์์ ํ์.
var myArray = [ "foo", 42, "bar" ];
myArray["3"] = "baz";
myArray.length; // 4
myArray[3]; // "baz"
Duplicating Objects
์๋ฐ์คํฌ๋ฆฝํธ์์ ํํ๊ฒ ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ ๋ณต์ฌ์ด๋ค. ํ์ง๋ง ๊ฐ์ฒด๋ฅผ ๋ณต์ ํ๋๊ฒ์ ์๊ฐ๋ณด๋ค ๋ง์ด ๋ณต์กํ๋ค.
function anotherFunction() { /*..*/ }
var anotherObject = {
c: true
};
var anotherArray = [];
var myObject = {
a: 2,
b: anotherObject, // reference, not a copy!
c: anotherArray, // another reference!
d: anotherFunction
};
anotherArray.push( anotherObject, myObject );
์ฐ์ ๊น์๋ณต์ฌ์ ์์ ๋ณต์ฌ์ค ์ด๋๊ฒ์ ํด๋นํ๋์ง ๋ตํด์ผํ๋ค. ๋ชจ๋ ์ฐธ์กฐ๊ฐ์ ๊ฐ๊ณ ์์ผ๋ฏ๋ก ๊ฐ์ฒด๋ ์ํ ์ฐธ์กฐ์ ์ํ์ฑ์ด์๋ค.
๋ณต์ ์๋ํ ํ์ค์ ์ ํด์ ธ์์ง ์๊ณ , ๊ฐ JS ํ๋ ์์ํฌ๋ค์ ์์์ ์๊ธฐ๋ค๋ง์ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค. ํ๋์ ์๋ฃจ์ ์ JSON์ ์ด์ฉํ๋๊ฒ์ด๋ค.
var newObj = JSON.parse( JSON.stringify( someObj ) );
ES6๋ ์์ ๋ณต์ฌ๋ฅผ Object.assign()์ผ๋ก ์ ์ํ๋ค.
var newObj = Object.assign( {}, myObject );
newObj.a; // 2
newObj.b === anotherObject; // true
newObj.c === anotherArray; // true
newObj.d === anotherFunction; // true
Property Descriptors
var myObject = {
a: 2
};
Object.getOwnPropertyDescriptor( myObject, "a" );
// {
// value: 2,
// writable: true,
// enumerable: true,
// configurable: true
// }
var myObject = {};
Object.defineProperty( myObject, "a", {
value: 2,
writable: true,
configurable: true,
enumerable: true
} );
myObject.a; // 2
Writable
var myObject = {};
Object.defineProperty( myObject, "a", {
value: 2,
writable: false, // not writable!
configurable: true,
enumerable: true
} );
myObject.a = 3;
myObject.a; // 2
strict mode์์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
"use strict";
var myObject = {};
Object.defineProperty( myObject, "a", {
value: 2,
writable: false, // not writable!
configurable: true,
enumerable: true
} );
myObject.a = 3; // TypeError
Configurable
var myObject = {
a: 2
};
myObject.a = 3;
myObject.a; // 3
Object.defineProperty( myObject, "a", {
value: 4,
writable: true,
configurable: false, // not configurable!
enumerable: true
} );
myObject.a; // 4
myObject.a = 5;
myObject.a; // 5
Object.defineProperty( myObject, "a", {
value: 6,
writable: true,
configurable: true,
enumerable: true
} ); // TypeError
ํ๋ฒ false๋ฉด true๋ก ๋ฐ๊ฟ ์ ์๋ค.
๋ํ configurable์ ๊ฐ์ฒด๊ฐ delete ์ฐ์ฐ์์ ์ํด ์ ๊ฑฐ๋๋๊ฒ์ ๋ฐฉ์งํ๋ค.
var myObject = {
a: 2
};
myObject.a; // 2
delete myObject.a;
myObject.a; // undefined
Object.defineProperty( myObject, "a", {
value: 2,
writable: true,
configurable: false,
enumerable: true
} );
myObject.a; // 2
delete myObject.a;
myObject.a; // 2
delete๋ c,c++์์์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ ํด์ ์ญํ ๋ณด๋ค๋ ๊ฐ์ฒด ์์ฑ์ ์ ๊ฑฐํ๋ ์ญํ ๋ก ์๊ฐํ์.
Immutability
๊ฐ์ฒด์ ๋ค๋ฅธ ์ฐธ์กฐ๊ฐ ์๋๊ฒฝ์ฐ ํด๋น ๊ฐ์ฒด์ ๋ด์ฉ์ ์ํฅ์ ๋ฐ์ง์๊ณ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ํ๋ฅผ ์ ์งํ๋ค.
myImmutableObject.foo; // [1,2,3]
myImmutableObject.foo.push( 4 );
myImmutableObject.foo; // [1,2,3,4]
myImmutableObject๊ฐ ๋ถ๋ณ์ผ๋ก ๋ณดํธ๋์ด๋ myImmutableObject.foo๋ ๋ณํ ์ ์๋ค.
Object Constant
writable : false ๋ฐ configurable : false๋ฅผ ๊ฒฐํฉํ์ฌ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๊ฐ์ฒด ์์ฑ์ ๋ง๋ค ์ ์๋ค.
var myObject = {};
Object.defineProperty( myObject, "FAVORITE_NUMBER", {
value: 42,
writable: false,
configurable: false
} );
Prevent Extensions
๊ฐ์ฒด์ ์ ์์ฑ ์ถ๊ฐ๋ฅผ ์๋ฐฉํ๊ณ ์ถ์ผ๋ฉด Object.preventExtensions(..)
์ ์ฌ์ฉํ์.
var myObject = {
a: 2
};
Object.preventExtensions( myObject );
myObject.b = 3;
myObject.b; // undefined
strict mode์์๋ TypeError๊ฐ ๋ฌ๋ค.
Seal
Object.seal(..)
์ Object.preventExtensions(..)
์ configurable:false
์ด ์ ์ฉ๋๋ค.
Freeze
Object.seal(..)
์ writable:false
๊น์ง ์ ์ฉ๋๋ค.
์ด๊ฒ ๊ฐ์ฒด์ ์ ์ฉํ ์ ์๋ ๊ฐ์ฅ ๋์ ์์ค์ ๋ถ๋ณ์ฑ์ด๋ค.
[Get](/hochan222/Everything-in-JavaScript/wiki/Get)
var myObject = {
a: 2
};
myObject.a; // 2
myObject.a๋ ์์ฑ ์ก์ธ์ค์ด์ง๋ง, ๋ณด์ด๋ ๊ฒ์ฒ๋ผ myObject์์ ์ด๋ฆ a์ ์์ฑ์ ์ฐพ๋ ๊ฒ์ ์๋๋ค.
์ฌ์์ ๋ฐ๋ฅด๋ฉด ์์ ์ฝ๋๋ myObject์์ Get ์ฐ์ฐ (ํจ์ ํธ์ถ๊ณผ ์ ์ฌ ํจ : Get ())์ ์ค์ ๋ก ์ํํ๋ค. ๊ฐ์ฒด์ ๋ํ ๊ธฐ๋ณธ ๋ด์ฅ Get ์์ ์ ๋จผ์ ์์ฒญ ๋ ์ด๋ฆ์ ์์ฑ์ ๋ํด ๊ฐ์ฒด๋ฅผ ๊ฒ์ฌํ๊ณ ,์ด๋ฅผ ์ฐพ์ผ๋ฉด ๊ทธ์ ๋ฐ๋ผ ๊ฐ์ ๋ฐํํ๋ค.
Get ์์ ์ ์ค์ํ ๊ฒฐ๊ณผ ์ค ํ๋๋ ์์ฒญ ๋ ์์ฑ์ ๋ํ ๊ฐ์ ์ป์ ์์๋ ๊ฒฝ์ฐ ๋์ undefined ๊ฐ์ ๋ฐํํ๋ค.
var myObject = {
a: 2
};
myObject.b; // undefined
var myObject = {
a: undefined
};
myObject.a; // undefined
myObject.b; // undefined
Get ์์ ์ ๋ฏธ๋ฌํ์ง๋ง ์ฐธ์กฐ myObject.a๋ณด๋ค ์ฐธ์กฐ myObject.b์ ๋ํด ๋ ๋ง์ ์์ ์ ์ํํ๋ค.
[Put](/hochan222/Everything-in-JavaScript/wiki/Put)
์์ฑ์์ ๊ฐ์ ๊ฐ์ ธ ์ค๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก ์ ์ ๋ Get ์์ ์ด ์์ผ๋ฏ๋ก ๊ธฐ๋ณธ Put ์์ ๋ ํ์ฐ์ ์ผ๋ก ์กด์ฌํ๋ค.
๋ค์์ Put ์๋ ๋ฐฉ์์ด๋ค.
- Property๊ฐ accessor descriptor์ธ์ง?
- ๋ง์ฝ์ ๋ง์ผ๋ฉด the setter๋ฅผ ํธ์ถํ๋ค.
- Property์ data descriptor์ writable์ด false๋ก ์ค์ ๋ผ์๋์ง?
- non-strict mode์์๋ ์คํจํ๊ณ , strict mode์์๋ TypeError๊ฐ ๋ฐ์ํ๋ค.
- ๋ค์ ํด๋น์ฌํญ์ ์์ผ๋ฉด ์กด์ฌํ๋ property์ ๊ฐ์ ์ ์์ผ๋ก ์ ์ฅํ๋ค.
Getters & Setters
ES5๋ getter ๋ฐ setter๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๊ธฐ๋ณธ ์์ ์ ์ผ๋ถ๋ฅผ ๊ฐ์ฒด ์์ค์ด ์๋๋ผ ์์ฑ ๋ณ ์์ค์์ ์ฌ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋์ ํ๋ค. getter๋ ์ค์ ๋ก ์จ๊ฒจ์ง ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ ๊ฒ์ํ๋ ์์ฑ์ด๋ค. setter ์ค์ ๋ก ๊ฐ์ ์ค์ ํ๊ธฐ ์ํด ์จ๊ฒจ์ง ํจ์๋ฅผ ํธ์ถํ๋ ์์ฑ์ด๋ค.
property์ getter, setter ๋๋ค ๊ฐ๊ฒ ์ค์ ํ๋ฉด ๊ทธ๊ฒ์ "data descriptor"๊ฐ ์๋ "accessor descriptor"๊ฐ ๋๋ค. accessor-descriptor๋ value
์ writable
์์ฑ์ด ๋ฌด์๋๋ค. ๋์ configurable
์ enumerable
๋ฅผ ๊ณ ๋ คํ๋ค.
var myObject = {
// define a getter for `a`
get a() {
return 2;
}
};
Object.defineProperty(
myObject, // target
"b", // property name
{ // descriptor
// define a getter for `b`
get: function(){ return this.a * 2 },
// make sure `b` shows up as an object property
enumerable: true
}
);
myObject.a; // 2
myObject.b; // 4
์... ์ด๊ฑด ๋ฌด์์ด๋.. ๊ฐ์ฒด์ getter๋ฅผ ์ค์ ํ ์๊ฐ ์์ด????
var myObject = {
// define a getter for `a`
get a() {
return 2;
}
};
myObject.a = 3;
myObject.a; // 2
ํญ์ getter, setter๋ ๊ฐ์ด ์ ์ํด์ฃผ๋๊ฒ ์ข๋ค.
var myObject = {
// define a getter for `a`
get a() {
return this._a_;
},
// define a setter for `a`
set a(val) {
this._a_ = val * 2;
}
};
myObject.a = 2;
myObject.a; // 4
Existence
์ฐ๋ฆฌ๋ ๋ค์ ๊ตฌ๋ฌธ์ ํตํด ์์ฑ์ ์กด์ฌ๋ฅผ ํ์ธ ํ ์ ์๋ค.
var myObject = {
a: 2
};
("a" in myObject); // true
("b" in myObject); // false
myObject.hasOwnProperty( "a" ); // true
myObject.hasOwnProperty( "b" ); // false
in ์ฐ์ฐ์๋ ๊ฐ์ฒด์ ์์ฑ์ด ์๋์ง๋ ์์ Prototype ์ฒด์ธ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ค. ๋ฐ๋ฉด hasOwnProperty๋ ๊ฐ์ฒด์ ์์ฑ์ด ์๋์ง๋ง ํ์ธํ๋ค.
Enumeration
var myObject = { };
Object.defineProperty(
myObject,
"a",
// make `a` enumerable, as normal
{ enumerable: true, value: 2 }
);
Object.defineProperty(
myObject,
"b",
// make `b` NON-enumerable
{ 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
๊ทธ๋ ๋ค enumerable์ ์ง์คํ๋ผ false๋ enumerable ํ ์ ์๋ค.
์ด๊ฑฐ๋ฅผ ํ์ธํ ์ ์๋ ๋๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
var myObject = { };
Object.defineProperty(
myObject,
"a",
// make `a` enumerable, as normal
{ enumerable: true, value: 2 }
);
Object.defineProperty(
myObject,
"b",
// make `b` non-enumerable
{ enumerable: false, value: 3 }
);
myObject.propertyIsEnumerable( "a" ); // true
myObject.propertyIsEnumerable( "b" ); // false
Object.keys( myObject ); // ["a"]
Object.getOwnPropertyNames( myObject ); // ["a", "b"]
Iteration
๋ณดํต ์์ ์ถ๋ ฅํ ๋ ๋ค์๊ณผ ๊ฐ์ดํ๋๋ฐ
var myArray = [1, 2, 3];
for (var i = 0; i < myArray.length; i++) {
console.log( myArray[i] );
}
// 1 2 3
์ด๊ฑด ๊ฐ์ ๋ฐ๋ณตํ๋๊ฒ์๋๊ณ ์ธ๋ฑ์ค๋ฅผ ๋ฐ๋ณตํ๋๊ฒ์ด๋ค.
์ด์ forEach(), every(), some()๋ฑ์ ๊ฐ์ ๋ฐ๋ณตํ๋ค.
for in ์ ๊ฐ์ด ์๋ ์ด๊ฑฐ๊ฐ๋ฅํ ๊ฐ์ฒด ์์ฑ์ ๋ฐ๋ณตํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ ์ผ๋ก๋ง ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
๊ฐ์ ๋ฐ๋ณตํ๊ณ ์ถ๋ค. ES6์ of๋ฅผ ์ด์ฉํด ๊ฐ๋ฅํ๊ฒ ํ๋ค.
var myArray = [ 1, 2, 3 ];
for (var v of myArray) {
console.log( v );
}
// 1
// 2
// 3
for..of ๋ฃจํ๋ ๋ฐ๋ณต ๋ iterator ๊ฐ์ฒด(spec-speak์์ @@iterator๋ก ์๋ ค์ง ๊ธฐ๋ณธ ๋ด๋ถ ํจ์์์)๋ฅผ ์์ฒญํ๊ณ , ๋ฃจํ๋ ํด๋น iterator ๊ฐ์ฒด์ ๋ค์ ํธ์ถ์์ ์ฐ์์ ์ธ ๋ฐํ ๊ฐ์ ๋ฐ๋ณตํ๋ค.
๋ฐฐ์ด์๋ ๋ด์ฅ @@iterator๊ฐ ์๋ค. ์๋ ๋ฐ๋ณต ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
var myArray = [ 1, 2, 3 ];
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 }
@@iterator๋ ๋ฐ๋ณต๊ธฐ ๊ฐ์ฒด ์์ฒด๊ฐ ์๋๋ผ ๋ฐ๋ณต๊ธฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
๋ฐ๋ณต๊ธฐ์ next() ํธ์ถ์์ ๋ฐํ ๊ฐ์ ํํ๋ { value: _ , done: _ }์ด๋ค. value๋ ํ์ฌ ๊ฐ์ด๊ณ done์ bool ๊ฐ์ด๋ค.
for of ์์๋ ์๋์ผ๋ก ๋ฐ๋ณต๋์ง๋ง ์ผ๋ฐ ๊ฐ์ฒด์๋ @@iterator๊ฐ ์กด์ฌํ์ง ์๋๋ค. ๋ฐ๋ณตํ๋ ค๋ ๋ชจ๋ ๊ฐ์ฒด์ ๋ํด ๊ณ ์ ํ ๊ธฐ๋ณธ @@ iterator๋ฅผ ์ ์ ํ ์ ์๋ค.
var myObject = {
a: 2,
b: 3
};
Object.defineProperty( 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 {
value: o[ks[idx++]],
done: (idx > ks.length)
};
}
};
}
} );
// iterate `myObject` manually
var it = myObject[Symbol.iterator]();
it.next(); // { value:2, done:false }
it.next(); // { value:3, done:false }
it.next(); // { value:undefined, done:true }
// iterate `myObject` with `for..of`
for (var v of myObject) {
console.log( v );
}
// 2
// 3
์... iterator ๊ตฌํ...
for of๋ ES6์ ์ฌ์ฉ์ ์ง์ iterator์ ๋์ํ๊ธฐ์ํ ๋ฌธ๋ฒ์ด๋ค!
Review (TL;DR)
- ๊ฐ์ฒด์๋ ๋ง์ ์ต์ ์ด ์๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ๊ฑด ๊ฐ์ฒด์ด๋ค๋ผ๋ ์๊ฐ์ ํ๋ ธ๋ค. ๊ฐ์ฒด๋ primitive value์ค ํ๋์ด๋ค.
- ๊ฐ์ฒด์๋ ํ์ ์ ํ์ด ์๊ณ [object Array] ์ ๊ฐ์ด ํน์ ๋์์ ํนํ์ํฌ ์ ์๋ค.
- ๊ฐ์ฒด์์ get push์ ์กด์ฌ.
- ๊ฐ์ฒด์ ์ต์ ์ ์ง์ ํ ์ ์๋ ์ฌ๋ฌ ๋ฉ์๋๋ค..
Object.preventExtensions(..)
,Object.seal(..)
,Object.freeze(..)
- ๊ฐ์ฒด์ iterator