Object.prototype.__proto__
지원이 중단되었습니다: 이 기능은 더 이상 권장되지 않습니다. 일부 브라우저에서는 아직 지원할 수 있지만 관련 웹 표준에서 이미 제거되었거나 제거 과정에 있는 경우가 있으며, 호환성을 위해 유지되고 있을 수 있습니다. 사용을 피하고 가능하다면 기존 코드를 업데이트하세요. 결정을 지원할하단의 호환성 표를 확인하세요. 이 기능은 언제든지 작동을 중단할 수 있음을 유의하세요.
주의: 객체의
[[Prototype]]
을 변경하는 것은 최신 JavaScript 엔진이 속성 접근을 최적화하는 방식의 특성상모든 브라우저 및 JavaScript 엔진에서 매우 느린 작업입니다. 상속 구조를 변경하는 것이 성능에 미치는 영향은 미묘하고 광범위하며,obj.__proto__ = ...
문에 소요되는 시간 뿐만 아니라[[Prototype]]
이 변경된 객체에 접근할 수 있는모든 코드들에 대해서도 영향을 줄 수 있습니다. 성능에 관심이 있다면 객체의[[Prototype]]
설정을 피해야 합니다. 대신Object.create()
를 사용하여 원하는[[Prototype]]
으로 새 객체를 만드세요.
주의:
Object.prototype.__proto__
는 오늘날 대부분의 브라우저에서 지원되지만, 그 존재와 정확한 동작은 오직 웹 브라우저와의 호환성을 보장하기 위한 레거시 기능으로서 ECMAScript 2015 사양에서 비로소 표준화되었습니다. 더 나은 지원을 위해 대신Object.getPrototypeOf()
를 사용하세요.
Object.prototype
의__proto__
속성은 접근하고자 하는 객체의 내부 속성인[[Prototype]]
(객체 또는null
)를 노출하는 접근자 속성(getter 및 setter 함수)입니다.
__proto__
의 사용은 논란의 여지가 있으며 권장하지 않습니다. 원래는 ECMAScript 언어 사양에 포함되지 않았음에도 불구하고 최신 브라우저에서는 이를 구현했습니다. 최근에서야 ECMAScript 2015 사양에서 웹 브라우저와의 호환성을 위해 표준화되었으므로 향후에도 지원은 될 것입니다. 그러나__proto__
는 더이상 사용하지 않길 바라며, 대신Object.getPrototypeOf
/Reflect.getPrototypeOf
및Object.setPrototypeOf
/Reflect.setPrototypeOf
를 권장합니다(객체의[[Prototype]]
설정은 성능을 고려할 경우 피해야 하는 느린 작업입니다).
객체 리터럴을 정의할 때Object.create()
대신__proto__
속성을 사용함으로써 객체의[[Prototype]]
을 설정할 수도 있습니다. 참고:object initializer / literal syntax.
설명
__proto__
getter 함수는 객체의 내부[[Prototype]]
값을 노출합니다. 객체 리터럴을 사용하여 생성된 객체의 경우 이 값은Object.prototype
입니다. 배열 리터럴을 사용하여 생성된 객체의 경우 이 값은Array.prototype
입니다. 함수의 경우 이 값은Function.prototype
입니다.new fun
을 사용하여 생성된 객체의 경우 (여기서fun
은 JavaScript에서 제공하는 내장 생성자 함수 중 하나입니다.Array
,Boolean
,Date
,Number
,Object
,String
등 - JavaScript가 발전함에 따라 추가된 새로운 생성자 포함) 이 값은 항상fun.prototype
입니다.new fun
을 사용하여 생성된 객체의 경우fun
은 스크립트에 정의된 함수이며 이 값은fun.prototype
의 값입니다. (즉, 생성자가 다른 객체를 명시적으로 반환하지 않았거나 인스턴스가 생성된 이후에fun.prototype
이 다시 할당된 경우입니다.)
__proto__
setter를 사용하면 객체의[[Prototype]]
이 변경될 수 있습니다. 객체는Object.isExtensible()
에 따라 확장 가능해야 합니다. 그렇지 않으면TypeError
가 발생합니다. 제공된 값은 객체 또는null
여야 합니다. 다른 값을 제공하면 아무 효과가 없습니다.
프로토타입이 상속에 사용되는 방식을 이해하려면 가이드 문서상속과 프로토타입 체인를 참조하세요.
__proto__
속성은 getter 및 setter 함수로 구성된Object.prototype
의 간단한 접근자 속성입니다.Object.prototype
를 참조하는 경우__proto__
에 접근하면Object.prototype
를 찾지만,Object.prototype
를 참조하지 않는 경우에는 찾을 수 없습니다.Object.prototype
보다 먼저 다른__proto__
속성이 발견되는 경우 이 속성에 의해Object.prototype
는 숨겨집니다.
예제
__proto__ 사용하기
function Circle() {}const shape = {};const circle = new Circle();// Set the object prototype// DEPRECATED. 예시용일 뿐입니다. 실제 코드에서는 이렇게 하지 마세요.shape.__proto__ = circle;// Get the object prototypeconsole.log(shape.__proto__ === Circle); // falseconst ShapeA = function () {};const ShapeB = { a() { console.log("aaa"); },};console.log((ShapeA.prototype.__proto__ = ShapeB));const shapea = new ShapeA();shapea.a(); // aaaconsole.log(ShapeA.prototype === shapea.__proto__); // true// 또는const ShapeC = function () {};const ShapeD = { a() { console.log("a"); },};const shapeC = new ShapeC();shapeC.__proto__ = ShapeD;shapeC.a(); // aconsole.log(ShapeC.prototype === shapeC.__proto__); // false// 또는function Test() {}Test.prototype.myname = function () { console.log("myname");};const a = new Test();console.log(a.__proto__ === Test.prototype); // truea.myname(); // myname// 또는const fn = function () {};fn.prototype.myname = function () { console.log("myname");};var obj = { __proto__: fn.prototype,};obj.myname(); // myname
명세
Specification |
---|
ECMAScript® 2026 Language Specification # sec-object.prototype.__proto__ |