메서드 정의와 super
, [[HomeObject]]
- 메서드 정의 문법은
function
키워드 없이 객체 내에서 메서드를 선언하는 것이다. [[HomeObject]]
에 접근할 수 있도록 해준다.super
에 접근이 가능하다.
const obj = {
functionProperty: function() {
// 함수 프로퍼티 문법 (function 키워드 사용)
}
method() {
// 메서드 정의 (function 키워드와 ':' 이 없음)
},
};
super
접근 예제코드
정말 메서드 문법에서만 super
에 접근 가능한지 확인해보자.
메서드 문법을 사용하지 않는 경우
const obj1 = {
name: "Joe",
toString: function () {
return super.toString();
},
};
console.log(obj1.toString()); // Uncaught SyntaxError: 'super' keyword unexpected here
toString()
의 결과로 문법 에러 메세지가 출력되었다.- 우리 눈엔 보이지 않지만,
[[HomeObject]]
가null
을 가리키고 있다.- 자바스크립트 엔진에서 처리된다.
메서드 문법을 사용하는 경우
const obj1 = {
name: "Joe",
toString() {
return super.toString();
},
};
console.log(obj1.toString()); // [object Object]
toString()
의 결과로Object.prototype.toString()
이 호출되었다.[[HomeObject]]
가 상위 객체인Object
를 가리키고 있어서,super
키워드를 통해 상위 객체의 메서드를 불러올 수 있었다.- 메서드 내부 함수 스코프에서
super
([[HomeObject]]
) 접근이 가능하다.
- 메서드 내부 함수 스코프에서
super
는 메서드가 실행되는 시점에 평가된다.
const obj = {
toString() {
return super.toString().toUpperCase();
},
};
Object.setPrototypeOf(obj, {
toString() {
return "a different string";
},
});
console.log(obj.toString()); // "A DIFFERENT STRING"
super
([[HomeObject]]
) 는 미리 설정되어 있는 것이 아니라 메서드가 실행되는 시점에 평가된다.- 선언 시의
super.toString()
은Object.toString()
이었으나console.log()
를 수행하는 시점엔Object.setPrototypeOf()
를 통해 프로토타입에 적용된 객체의toString()
이super.toString()
이 된다. - 이러한 이유로
A DIFFERENT STRING
이 출력된다.
- 선언 시의
[[HomeObject]]
링크는 메서드가super
를 사용하는지 여부와 관계없이 존재하지만,super
를 사용하지 않는 경우 자바스크립트 엔진은 링크를 최적화할 확률이 높다.
반응형
'자바스크립트 > 모던 자바스크립트' 카테고리의 다른 글
자바스크립트 클래스 1 - 기본 개념 (0) | 2023.02.01 |
---|---|
ES6 이후에 새롭게 정의된 Object 편의 정적 메서드들 (0) | 2023.01.30 |
모던 자바스크립트, 단축 속성 (shorthand properties) (0) | 2023.01.24 |
모던 자바스크립트, 계산된 속성 이름 (computed property name) (0) | 2023.01.24 |
모던 자바스크립트, 프로토타입 얻기 설정하기 (getPrototypeOf, setPrototypeOf) (0) | 2023.01.24 |