명시적 return — 원시값은 무시되고, 객체는 채택된다 (직접 고쳐보세요)
코드
팁: return 100return { z: 9 }로 바꾸면 Foo도 그 객체를 돌려준다.
싱글톤 — new를 두 번 해도 인스턴스는 하나 (직접 고쳐보세요)
코드
팁: return Config.instance; 줄을 지우면 매번 새 인스턴스가 생겨 a === b가 false가 된다.
Proxy 래핑 — 생성자가 this 대신 Proxy를 return (직접 고쳐보세요)
코드
팁: return new Proxy(...)를 지우면 평범한 인스턴스가 되어 변경 감지가 사라진다.
class도 함수다 — 그리고 new 가능 여부는 정의 방식이 가른다 (직접 고쳐보세요)
코드
class는 [[Construct]]는 있지만 [[Call]]이 막혀 있고, 화살표는 [[Construct]] 자체가 없다.
prototype은 new 이전, 함수 정의 시점에 이미 존재한다 (직접 고쳐보세요)
코드
생성자로 못 쓰는 화살표 함수엔 prototype 프로퍼티가 아예 없다(undefined).
위임의 증거 — 인스턴스를 만든 '후에' 추가한 메서드도 동작한다 (직접 고쳐보세요)
코드
복사가 아니라 링크(위임)이기 때문에, 부모를 나중에 바꿔도 살아있는 자식에 즉시 반영된다.
⚠️ instanceof 뒤에 엉뚱한 타입 → 무한 재귀로 RangeError (Run을 눌러 직접 확인)
코드
new Person()이 만드는 객체는 항상 Person(Date 아님)이라 가드를 영원히 못 빠져나간다.
✅ 올바른 가드: 자기 자신 instanceof / new.target (직접 고쳐보세요)
코드
new로 만든 객체가 가드 조건을 '만족'하므로 두 번째 호출에서 빠져나간다.