객체 속성과의 상호작용은 대부분 객체 리터럴 생성, 객체 리터럴 설정 및 속성 값을 설정할 수 있습니다. 그러나 GKE 클러스터와 같은 이러한 속성에 액세스하는 방법을 세부적으로 제어하기 위한 객체 변경, 정의될 수 있습니다 모든 객체 속성에는 보이지 않는 속성 집합이 있습니다 '속성'이라고 하는 해당 속성과 연결된 메타데이터를 포함하는 참조하세요.
속성과 관련된 두 가지 유형의 설명어가 있습니다. 데이터 설명자 및 접근자 설명자. 데이터 설명어에는 다음이 포함됩니다. 키-값 쌍에 속성 값을 포함하는지 여부에 관계없이 쓰기 가능, 구성 가능 또는 열거 가능합니다. 접근자 설명자에는 다음이 포함됩니다. 속성이 설정, 변경 또는 액세스될 때 실행되는 함수입니다.
속성 | 설명어 유형 | Object.defineProperty() 의 기본값 |
설명 |
---|---|---|---|
[[Value]] |
데이터 | undefined |
속성의 값을 포함합니다. |
[[Writable]] |
데이터 | false |
속성의 값을 변경할 수 있는지 여부를 결정합니다. |
[[Get]] |
접근자 | undefined |
속성의 getter 함수로, 속성에 액세스할 수 있습니다. |
[[Set]] |
접근자 | undefined |
속성의 setter 함수는 속성이 설정되거나 변경될 때 |
[[Configurable]] |
둘 다 | false |
false 인 경우 속성을 삭제할 수 없으며
속성은 변경할 수 없습니다. false 이고
[[Writable]] 가 true 이면 속성 값은
변경할 수 있습니다 |
[[Enumerable]] |
둘 다 | false |
true 이면
for...in 루프 또는 Object.keys() 정적
메서드를 사용하여 축소하도록 요청합니다. |
이러한 각 속성은 [[Prototype]]
와 동일한 약칭을 사용하여 다음을 나타냅니다.
이러한 속성에 직접 액세스해서는 안 됩니다. 대신
Object.defineProperty()
정적 메서드는
객체를 지정합니다. Object.defineProperty()
는 작업할 객체,
만들거나 수정할 속성 키 및
생성 또는 수정 중인 속성과 연결된 설명어입니다.
기본적으로 Object.defineProperty()
를 사용하여 만든 속성은
쓰기 가능하거나, 열거 가능하거나, 구성할 수 없습니다. 하지만 생성하는 속성은
객체 리터럴의 일부로 또는 점 또는 대괄호 표기법을 사용하는 것이
쓰기 및 열거 가능하고 구성 가능합니다.
const myObj = {};
Object.defineProperty(myObj, 'myProperty', {
value: true,
writable: false
});
myObj.myProperty;
> true
myObj.myProperty = false;
myObj.myProperty;
> true
예를 들어 [[Writable]]
에 false
값이 있는 경우 새 값을 설정하려고 합니다.
가 엄격 모드를 벗어나면 자동으로 실패하고
엄격 모드에서 발생하는 오류:
{
const myObj = {};
Object.defineProperty(myObj, 'myProperty', {
value: true,
writable: false
});
myObj.myProperty = false;
myObj.myProperty;
}
> true
(function () {
"use strict";
const myObj = {};
Object.defineProperty(myObj, 'myProperty', {
value: true,
writable: false
});
myObj.myProperty = false;
myObj.myProperty;
}());\
> Uncaught TypeError: "myProperty" is read-only
설명어를 효과적으로 사용하는 것은 상당히 고급 개념이지만,
객체를 이해하려면 객체의 내부 구조를 이해하는 것이 필수적입니다
객체 사용과 관련된 구문을 더 일반적인 방식으로 다룰 것입니다. 예를 들어
Object.create()
정적 메서드를 사용할 때 이러한 개념이 적용됩니다.
이를 통해 새 프로토타입에 연결된 모든 프로토타입을 세밀하게
객체를 지정합니다.
Object.create()
는 기존 객체를 자신의 값으로 사용하여 새 객체를 만듭니다.
프로토타입을 제작합니다. 이렇게 하면 새 객체가 다른 객체의 속성과 메서드를 상속할 수 있습니다.
객체가 사용자 정의 객체의 속성을 상속하는 것과 동일한 방식으로
JavaScript의 기본 제공 Object
프로토타입 다음을 사용하여 Object.create()
를 호출하는 경우
객체를 인수로 사용하면 전달된 객체를
프로토타입을 제작합니다.
const myCustomPrototype = {
'myInheritedProp': 10
};
const newObject = Object.create( myCustomPrototype );
newObject;
> Object { }
<prototype>: Object { myInheritedProp: 10 }
myInheritedProp: 10
<prototype>: Object { … }
Object.create
는
Object.defineProperty()
와 유사한 문법을 사용하여 새로 만든 객체를 만듭니다.
즉, 객체를 설명어 속성 집합에 매핑하는 객체입니다.
const myCustomPrototype = {
'myInheritedProp': 10
};
const myObj = Object.create( myCustomPrototype, {
myProperty: {
value: "The new property value.",
writable: true,
configurable: true
}
});
myObj;
> Object { … }
myProperty: "The new property value."
<prototype>: Object { myInheritedProp: 10 }
이 예에서 새 객체 (myObj
)는 객체 리터럴을 사용합니다.
(myCustomPrototype
)를 프로토타입으로 사용합니다. 여기에는 상속된
Object.prototype
라는 함수로 표현하면 다음과 같은 일련의 상속된 프로토타입이 생성됩니다.
프로토타입 체인입니다. 각 객체에는 할당이든 상속되든
할당되거나 상속된 자체 프로토타입이 있습니다. 이 체인은
자체 프로토타입이 없는 null
프로토타입입니다.
const myPrototype = {
'protoProp': 10
};
const newObject = Object.setPrototypeOf( { 'objProp' : true }, myPrototype );
newObject;
> Object { objProp: true }
objProp: true
<prototype>: Object { protoProp: 10 }
protoProp: 10
<prototype>: Object { … }
값의 프로토타입에 포함된 속성은 '최상위 수준'에서 사용할 수 있습니다. 프로토타입 속성에 직접 액세스하지 않아도 됩니다.
const objectLiteral = {
"value" : true
};
objectLiteral;
> Object { value: true }
value: true
<prototype>: Object { … }
objectLiteral.toString();
"[object Object]"
이 패턴은 프로토타입에 연결된 전체 프로토타입 체인에 객체: 속성에 액세스하려고 할 때 인터프리터는 속성 프로토타입 체인의 처음부터 끝까지 속성을 찾거나 체인이 종료됩니다.
const myCustomPrototype = {
'protoProp': "Prototype property value."
};
const myObj = Object.create( myCustomPrototype, {
myProperty: {
value: "Top-level property value.",
writable: true,
configurable: true
}
});
myObj.protoProp;
> "Prototype property value."
이해도 확인
접근자는 어떤 설명어인가요?
[[Get]]
[[Set]]
[[Writable]]