속성 설명어

객체 속성과의 상호작용은 대부분 객체 리터럴 생성, 객체 리터럴 설정 및 속성 값을 설정할 수 있습니다. 그러나 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.createObject.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]]