diff options
Diffstat (limited to 'files/ko')
-rw-r--r-- | files/ko/web/javascript/reference/global_objects/object/index.md | 401 |
1 files changed, 233 insertions, 168 deletions
diff --git a/files/ko/web/javascript/reference/global_objects/object/index.md b/files/ko/web/javascript/reference/global_objects/object/index.md index d76739238f..4fd347fb92 100644 --- a/files/ko/web/javascript/reference/global_objects/object/index.md +++ b/files/ko/web/javascript/reference/global_objects/object/index.md @@ -2,176 +2,241 @@ title: Object slug: Web/JavaScript/Reference/Global_Objects/Object tags: - - Constructor + - Class - JavaScript - Object - - Reference translation_of: Web/JavaScript/Reference/Global_Objects/Object --- -<div>{{JSRef}}</div> -<p><strong><code>Object</code></strong> 생성자는 객체 래퍼(wrapper)를 생성합니다.</p> - -<h2 id="구문">구문</h2> - -<pre class="syntaxbox">// 객체 초기자 또는 리터럴 -{ [ <var>nameValuePair1</var>[, <var>nameValuePair2</var>[, ...<var>nameValuePairN</var>] ] ] } - -// 생성자 -new Object([<var>value</var>])</pre> - -<h3 id="매개변수">매개변수</h3> - -<dl> - <dt><code>nameValuePair1, nameValuePair2, ... nameValuePair<em>N</em></code></dt> - <dd>콜론으로 나뉘어져 있는 키(문자열)와 값(어떤 값이나 가능)의 쌍.</dd> - <dt><code>value</code></dt> - <dd>아무 값.</dd> -</dl> - -<h2 id="설명">설명</h2> - -<p><code>Object</code> 생성자는 주어진 값의 객체 래퍼를 생성합니다. 주어진 값이 {{jsxref("null")}}이거나 {{jsxref("undefined")}}면 빈 객체를 생성해 반환하고, 그렇지 않으면 값에 맞는 자료형의 객체를 반환합니다. 만약 값이 이미 객체이면 그 값을 그대로 반환합니다.</p> - -<p>생성자가 아닌 맥락에서 호출하면 <code>Object</code>는 <code>new Object()</code>와 동일하게 동작합니다.</p> - -<p><a href="/ko/docs/Web/JavaScript/Reference/Operators/Object_initializer">객체 초기자(리터럴 구문)</a>도 참고하세요.</p> - -<h2 id="Object_생성자의_속성"><code>Object</code> 생성자의 속성</h2> - -<dl> - <dt><code>Object.length</code></dt> - <dd>1의 값을 가집니다.</dd> -</dl> - -<dl> - <dt>{{jsxref("Object.prototype")}}</dt> - <dd><code>Object</code> 형의 모든 객체에 속성을 추가할 수 있습니다.</dd> -</dl> - -<h2 id="Object_생성자의_메서드"><code>Object</code> 생성자의 메서드</h2> - -<dl> - <dt>{{jsxref("Object.assign()")}}</dt> - <dd>하나 이상의 원본 객체들로부터 모든 열거가능한 속성들을 대상 객체로 복사합니다.</dd> - <dt>{{jsxref("Object.create()")}}</dt> - <dd>주어진 프로토타입(prototype)의 객체와 속성들을 갖고 있는 새 객체를 생성합니다.</dd> - <dt>{{jsxref("Object.defineProperty()")}}</dt> - <dd>주어진 기술자(descriptor)에 의해 기술된(described) 이름붙은 속성을 객체에 추가합니다.</dd> - <dt>{{jsxref("Object.defineProperties()")}}</dt> - <dd>주어진 기술자들에 맞는 이름붙은 속성들을 객체에 추가합니다.</dd> - <dt>{{jsxref("Object.freeze()")}}</dt> - <dd>객체를 프리징(freeze)합니다. 즉, 다른 곳의 코드에서 객체의 속성을 지우거나 바꿀 수 없습니다.</dd> - <dt>{{jsxref("Object.getOwnPropertyDescriptor()")}}</dt> - <dd>객체의 이름붙은 속성의 기술자를 반환합니다.</dd> - <dt>{{jsxref("Object.getOwnPropertyNames()")}}</dt> - <dd>주어진 객체 <strong>자신만의</strong> 열거가능하거나 열거불가능한 속성들의 이름을 포함하는 배열(array)을 반환합니다.</dd> - <dt>{{jsxref("Object.getOwnPropertySymbols()")}}</dt> - <dd>주어진 객체에서 바로 찾을 수 있는 모든 심볼 속성을 배열로 반환합니다.</dd> - <dt>{{jsxref("Object.getPrototypeOf()")}}</dt> - <dd>명시된 객체의 프로토타입을 반환.</dd> - <dt>{{jsxref("Object.is()")}}</dt> - <dd>두 값이 같은지를 비교합니다. 모든 NaN 값은 같다고 처리됩니다.(다른 추상적 또는 엄격한 등호 비교에서는 다르게 처리됩니다)</dd> - <dt>{{jsxref("Object.isExtensible()")}}</dt> - <dd>객체의 확장이 가능한지 확인합니다.</dd> - <dt>{{jsxref("Object.isFrozen()")}}</dt> - <dd>객체가 프리징 되었는지 확인합니다.</dd> - <dt>{{jsxref("Object.isSealed()")}}</dt> - <dd>객체가 실링(seal) 되었는지 확인합니다.</dd> - <dt>{{jsxref("Object.keys()")}}</dt> - <dd>주어진 객체 <strong>자신의 </strong>열거가능한 속성들의 이름의 배열을 반환합니다.</dd> - <dt>{{jsxref("Object.preventExtensions()")}}</dt> - <dd>객체가 확장되는 것을 못하도록 합니다.</dd> - <dt>{{jsxref("Object.seal()")}}</dt> - <dd>다른 코드가 객체의 속성을 삭제하지 못하도록 합니다.</dd> - <dt>{{jsxref("Object.setPrototypeOf()")}}</dt> - <dd>프로토타입(즉, 내부의 <code>[[Prototype]]</code> 속성)을 설정합니다.</dd> -</dl> - -<dl> - <dt>{{jsxref("Object.values()")}}</dt> - <dd>주어진 객체의 열거가능한 모든 스트링 속성들의 값들을 포함하고 있는 배열을 반환합니다.</dd> -</dl> - -<h2 id="Object_instances"><code>Object</code> 인스턴스와 <code>Object</code> 프로토타입 객체</h2> - -<p>JavaScript에서 모든 객체들은 <code>Object</code>의 자손입니다. 모든 객체는 {{jsxref("Object.prototype")}}으로부터 메서드와 속성을 상속하는데, 나중에 덮어 쓸 수도 있습니다. 예를 들어, 다른 생성자의 프로토타입은 그 <code>constructor</code> 속성을 덮어쓰고 자신의 <code>toString()</code> 메소드들을 제공합니다. <code>Object</code> 프로토타입 객체에 대한 변경 내용은 그 변경 내용에 영향을 받는 속성들과 메소드들이 프로토타입 체인(chain)을 따라 더이상 무시되지 않는한, 모든 객체들로 전달됩니다.</p> - -<h3 id="속성">속성</h3> - -<div>{{page('/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype', '속성') }}</div> - -<h3 id="메서드">메서드</h3> - -<div>{{page('/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype', '메서드') }}</div> - -<h2 id="Examples">예제</h2> - -<h3 id="Example.3A_Using_Object_given_undefined_and_null_types"><code>undefined</code>와 <code>null</code>을 지정</h3> - -<p>다음 예제는 변수 <code>o</code>에 빈 <code>Object</code> 객체를 저장합니다.</p> - -<pre class="brush: js">var o = new Object(); -</pre> - -<pre class="brush: js">var o = new Object(undefined); -</pre> - -<pre class="brush: js">var o = new Object(null); -</pre> - -<h3 id="Object로_Boolean_객체_생성하기"><code>Object</code>로 <code>Boolean</code> 객체 생성하기</h3> - -<p>다음 예제는 변수 <code>o</code>에 {{jsxref("Boolean")}} 객체를 저장합니다.</p> - -<pre class="brush: js">// o = new Boolean(true)과 같음 -var o = new Object(true); -</pre> - -<pre class="brush: js">// o = new Boolean(false)과 같음 -var o = new Object(Boolean()); -</pre> - -<h2 id="명세">명세</h2> - -<table class="standard-table"> - <tbody> - <tr> - <th scope="col">Specification</th> - <th scope="col">Status</th> - <th scope="col">Comment</th> - </tr> - <tr> - <td>ECMAScript 1st Edition.</td> - <td>Standard</td> - <td>Initial definition. Implemented in JavaScript 1.0.</td> - </tr> - <tr> - <td>{{SpecName('ES5.1', '#sec-15.2', 'Object')}}</td> - <td>{{Spec2('ES5.1')}}</td> - <td> </td> - </tr> - <tr> - <td>{{SpecName('ES6', '#sec-object-objects', 'Object')}}</td> - <td>{{Spec2('ES6')}}</td> - <td>Added Object.assign, Object.getOwnPropertySymbols, Object.setPrototypeOf, Object.is</td> - </tr> - <tr> - <td>{{SpecName('ESDraft', '#sec-object-objects', 'Object')}}</td> - <td>{{Spec2('ESDraft')}}</td> - <td>Added Object.entries, Object.values and Object.getOwnPropertyDescriptors.</td> - </tr> - </tbody> -</table> - -<h2 id="브라우저_호환성">브라우저 호환성</h2> - - - -<p>{{Compat("javascript.builtins.Object")}}</p> - -<h2 id="See_also">같이 보기</h2> - -<ul> - <li><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Object_initializer">Object initializer</a></li> -</ul> +{{JSRef}} + +**`Object`** 클래스는 [JavaScript의 데이터 유형](/ko/docs/Web/JavaScript/Data_structures) 중 하나를 나타냅니다. 다양한 키 모음 및 더 복잡한 엔티티들을 저장하는 데 사용됩니다. 객체는 {{jsxref("Object/Object", "Object()")}} 생성자 또는 [객체 초기자 / 리터럴 구문](/ko/docs/Web/JavaScript/Reference/Operators/Object_initializer)를 통해 생성할 수 있습니다. + +## 설명 + +JavaScript의 거의 모든 객체는 {{jsxref("Object")}}의 인스턴스입니다. 일반적인 객체는 `Object.prototype`에서 속성(메서드 포함)을 상속하지만, 이러한 속성들은 가려질(재정의될) 수 있습니다. 그러나 `Object`는 의도적으로 가려지지 않게 생성되거나(예: {{jsxref("Object.create", "Object.create(null)")}}), 더이상 가려지지 않도록 변경될 수 있습니다(예: {{jsxref("Object.setPrototypeOf")}}). + +`Object` 프로토타입 객체에 대한 변경 사항은 해당 변경 사항의 대상이 되는 프로토타입 체인상의 속성 및 메서드가 추가로 재정의되지 않는 한 프로토타입 체인을 통해 **모든** 객체에서 볼 수 있습니다. 이것은 객체 동작을 재정의하거나 확장하는 매우 강력하지만 잠재적으로 위험한 메커니즘을 제공합니다. + +`Object` 생성자는 주어진 값에 대한 객체 래퍼를 생성합니다. + +- 값이 {{jsxref("null")}} 또는 {{jsxref("undefined")}}이면 빈 객체를 생성하여 반환합니다. +- 그렇지 않으면 주어진 값에 해당하는 타입의 객체를 반환합니다. +- 값이 이미 객체인 경우 그 값을 반환합니다. + +생성자가 아닌 맥락에서 호출될 때 `Object`는 `new Object()`와 동일하게 작동합니다. + +[객체 초기자 / 리터럴 구문](/ko/docs/Web/JavaScript/Reference/Operators/Object_initializer)도 참조하세요. + +### 객체의 속성 삭제하기 + +객체 자체에는 속성을 삭제하는 메서드가 없습니다(예: {{jsxref("Map.prototype.delete", "Map.prototype.delete()")}}). 삭제하기 위해서는 [delete 연산자](/ko/docs/Web/JavaScript/Reference/Operators/delete)를 사용해야 합니다. + +## 생성자 + +- {{jsxref("Object/Object", "Object()")}} + - : 새 `Object` 객체를 만듭니다. 이 때 생성된 객체는 주어진 값에 대한 래퍼입니다. + +## 정적 메서드 + +- {{jsxref("Object.assign","Object.assign()")}} + - : 하나 이상의 원본 객체들로부터 모든 열거 가능한 속성들을 대상 객체로 복사합니다. +- {{jsxref("Object.create","Object.create()")}} + - : 지정한 프로토타입(prototype)의 객체 및 속성을 갖고 있는 새 객체를 생성합니다. +- {{jsxref("Object.defineProperty","Object.defineProperty()")}} + - : 지정한 서술자(descriptor)에서 서술한 속성을 객체에 추가합니다. +- {{jsxref("Object.defineProperties","Object.defineProperties()")}} + - : 지정한 서술자들에서 서술한 속성들을 객체에 추가합니다. +- {{jsxref("Object.entries","Object.entries()")}} + - : 지정한 객체 **자신의** 모든 열거 가능한 문자열 속성들의 `[key, value]` 쌍으로 구성된 배열을 반환합니다. +- {{jsxref("Object.freeze","Object.freeze()")}} + - : 객체를 고정(freeze)합니다. 다른 곳의 코드에서 해당 속성을 삭제하거나 변경할 수 없게 됩니다. +- {{jsxref("Object.fromEntries","Object.fromEntries()")}} + - : `[key, value]` 쌍의 iterable로부터 새 객체를 반환합니다. ({{jsxref("Object.entries")}}의 반대입니다.) +- {{jsxref("Object.getOwnPropertyDescriptor","Object.getOwnPropertyDescriptor()")}} + - : 객체의 지정한 속성에 대한 속성 서술자를 반환합니다. +- {{jsxref("Object.getOwnPropertyDescriptors","Object.getOwnPropertyDescriptors()")}} + - : 객체 자신의 모든 속성 서술자들로 구성된 객체를 반환합니다. +- {{jsxref("Object.getOwnPropertyNames","Object.getOwnPropertyNames()")}} + - : 지정한 객체 **자신의** 모든 열거 가능하거나 불가능한 속성들의 이름으로 구성된 배열을 반환합니다. +- {{jsxref("Object.getOwnPropertySymbols","Object.getOwnPropertySymbols()")}} + - : 지정한 객체 자신의 모든 심볼 속성들로 구성된 배열을 반환합니다. +- {{jsxref("Object.getPrototypeOf","Object.getPrototypeOf()")}} + - : 지정한 객체의 프로토타입(내부 `[[Prototype]]` 속성)을 반환합니다. +- {{jsxref("Object.is","Object.is()")}} + - : 두 값이 같은지를 비교합니다. 모든 `NaN` 값을 같다고 처리합니다. (추상 동등 비교 및 엄격한 동등 비교와 다른 점입니다.) +- {{jsxref("Object.isExtensible","Object.isExtensible()")}} + - : 객체의 확장이 가능한지 여부를 확인합니다. +- {{jsxref("Object.isFrozen","Object.isFrozen()")}} + - : 객체가 고정(freeze)되었는지 여부를 확인합니다. +- {{jsxref("Object.isSealed","Object.isSealed()")}} + - : 객체가 봉인(seal)되었는지 여부를 확인합니다. +- {{jsxref("Object.keys","Object.keys()")}} + - : 지정한 객체 **자신의** 모든 열거 가능한 문자열 속성들의 이름으로 구성된 배열을 반환합니다. +- {{jsxref("Object.preventExtensions","Object.preventExtensions()")}} + - : 객체가 확장되지 못하도록 합니다. +- {{jsxref("Object.seal","Object.seal()")}} + - : 다른 코드가 객체의 속성을 삭제하지 못하도록 합니다. +- {{jsxref("Object.setPrototypeOf","Object.setPrototypeOf()")}} + - : 객체의 프로토타입(내부 `[[Prototype]]` 속성)을 설정합니다. +- {{jsxref("Object.values","Object.values()")}} + - : 지정한 객체 **자신의** 모든 열거 가능한 문자열 속성에 해당하는 값들로 구성된 배열을 반환합니다. + +## 인스턴스 속성 + +- {{jsxref("Object.prototype.constructor")}} + - : 객체의 프로토타입을 생성하는 함수를 지정합니다. +- {{jsxref("Object/proto","Object.prototype.__proto__")}} + - : 객체가 인스턴스화될 때 프로토타입으로 사용된 객체를 가리킵니다. + +## 인스턴스 메서드 + +- {{jsxref("Object.prototype.__defineGetter__()")}} + - : 액세스(get)할 때 실행되어 값을 반환하는 함수와 지정한 속성을 연결합니다. +- {{jsxref("Object.prototype.__defineSetter__()")}} + - : 설정(set)할 때 실행되어 해당 속성을 수정하는 함수와 지정한 속성을 연결합니다. +- {{jsxref("Object.prototype.__lookupGetter__()")}} + - : {{jsxref("Object.prototype.__defineGetter__()", "__defineGetter__()")}} 메서드에 의해 지정된 속성과 연결된 함수를 반환합니다. +- {{jsxref("Object.prototype.__lookupSetter__()")}} + - : {{jsxref("Object.prototype.__defineSetter__()", "__defineSetter__()")}} 메서드에 의해 지정된 속성과 연결된 함수를 반환합니다. +- {{jsxref("Object.prototype.hasOwnProperty()")}} + - : 객체에 지정한 속성이 해당 객체에 직접 포함되어 있고 프로토타입 체인을 통해 상속되지 않는지 여부를 나타내는 불리언 값을 반환합니다. +- {{jsxref("Object.prototype.isPrototypeOf()")}} + - : 이 메서드를 호출한 객체가 지정한 객체의 프로토타입 체인에 있는지 여부를 나타내는 불리언 값을 반환합니다. +- {{jsxref("Object.prototype.propertyIsEnumerable()")}} + - : 내부 [ECMAScript \[\[Enumerable\]\] 속성](/ko/docs/Web/JavaScript/Data_structures##%ec%86%8d%ec%84%b1_properties)이 설정되었는지 여부를 나타내는 불리언 값을 반환합니다. +- {{jsxref("Object.prototype.toLocaleString()")}} + - : {{jsxref("Object.toString", "toString()")}}를 호출합니다. +- {{jsxref("Object.prototype.toString()")}} + - : 객체의 문자열 표현을 반환합니다. +- {{jsxref("Object.prototype.valueOf()")}} + - : 지정한 객체의 원시 값을 반환합니다. + +## 예제 + +### `undefined` 및 `null` 타입을 지정한 `Object` 사용 + +다음 예제는 변수 `o`에 빈 `Object` 객체를 저장합니다. + +```js +let o = new Object() +``` + +```js +let o = new Object(undefined) +``` + +```js +let o = new Object(null) +``` + +### `Object`로 `Boolean` 객체 생성하기 + +다음 예제는 변수 `o`에 {{jsxref("Boolean")}} 객체를 저장합니다. + +```js +// o = new Boolean(true) 와 같음 +let o = new Object(true) +``` + +```js +// o = new Boolean(false) 와 같음 +let o = new Object(Boolean()) +``` + +### 객체 프로토타입 + +기존 `Object.prototype` 메서드의 동작을 변경하고자 할 때에는 기존 내용의 앞이나 뒤에 확장할 내용을 래핑하여 코드를 주입하는 것을 고려하세요. 예를 들어, 이 (테스트되지 않은) 코드는 기본 제공 코드 또는 다른 사람의 확장 실행되기 전에 사전 조건부로 사용자 정의 코드를 실행합니다. + +함수가 호출되면 호출에 대한 매개변수가 유사배열 "변수" [arguments 객체](/ko/docs/Web/JavaScript/Reference/Functions/arguments)에 보관됩니다. 예를 들어, `myFn(a, b, c)`를 호출하면 `myFn` 본문 내의 arguments 객체에는 `(a, b, c)`에 해당하는 3개의 유사배열요소가 포함됩니다. + +hook을 통해 프로토타입을 수정하고자 할 때엔 해당 함수에서 `apply()`를 호출하면서 `this`와 arguments 객체를 현재 동작에 전달합니다. 이 패턴은 `Node.prototype`, `Function.prototype` 등 모든 프로토타입에 적용할 수 있습니다. + +```js +var current = Object.prototype.valueOf +// 내가 지정한 속성 "-prop-value"은 범분야에 걸쳐 사용되고 있고 +// 항상 동일한 프로토타입 체인에 있지 않기 때문에, +// Object.prototype을 수정하고 싶습니다. +Object.prototype.valueOf = function () { + if (this.hasOwnProperty('-prop-value')) { + return this['-prop-value'] + } else { + // 내가 만든 객체가 아닌 것 같으므로, + // 가능한 최선을 다해 원래의 동작을 재현하여 기본 동작으로 돌아가겠습니다. + // 'apply' 메서드는 다른 언어에서의 'super'처럼 작동합니다. + // valueOf()가 arguments를 취하지 않더라도, 다른 hook이 있으리라 생각합니다. + return current.apply(this, arguments) + } +} +``` + +JavaScript에는 명확한 하위 클래스 객체가 없기 때문에, 프로토타입은 특정 기능의 "기본 클래스" 객체를 만드는 데 유용한 해결 방법입니다. 예를 들어: + +```js +var Person = function (name) { + this.name = name + this.canTalk = true +} +Person.prototype.greet = function () { + if (this.canTalk) { + console.log('Hi, I am ' + this.name) + } +} +var Employee = function (name, title) { + Person.call(this, name) + this.title = title +} +Employee.prototype = Object.create(Person.prototype) +Employee.prototype.constructor = Employee +// Object.prototype.constructor를 Employee로 설정하지 않으면 +// Person (parent)의 prototype.constructor를 사용합니다. +// 이를 피하기 위해 prototype.constructor를 Employee (child)로 설정합니다. +Employee.prototype.greet = function () { + if (this.canTalk) { + console.log('Hi, I am ' + this.name + ', the ' + this.title) + } +} +var Customer = function (name) { + Person.call(this, name) +} +Customer.prototype = Object.create(Person.prototype) +Customer.prototype.constructor = Customer +// Object.prototype.constructor를 Customer로 설정하지 않으면 +// Person (parent)의 prototype.constructor를 사용합니다. +// 이를 피하기 위해 prototype.constructor를 Customer (child)로 설정합니다. +var Mime = function (name) { + Person.call(this, name) + this.canTalk = false +} +Mime.prototype = Object.create(Person.prototype) +Mime.prototype.constructor = Mime +// Object.prototype.constructor를 Mime로 설정하지 않으면 +// Person (parent)의 prototype.constructor를 사용합니다. +// 이를 피하기 위해 prototype.constructor를 Mime (child)로 설정합니다. +var bob = new Employee('Bob', 'Builder') +var joe = new Customer('Joe') +var rg = new Employee('Red Green', 'Handyman') +var mike = new Customer('Mike') +var mime = new Mime('Mime') +bob.greet() +// Hi, I am Bob, the Builder +joe.greet() +// Hi, I am Joe +rg.greet() +// Hi, I am Red Green, the Handyman +mike.greet() +// Hi, I am Mike +mime.greet() +``` + +## 명세 + +{{Specifications}} + +## 브라우저 호환성 + +{{Compat}} + +## 같이 보기 + +- [객체 초기자](/ko/docs/Web/JavaScript/Reference/Operators/Object_initializer) |