>  기사  >  웹 프론트엔드  >  JavaScript에서 객체의 [[프로토타입]]을 수정하는 것이 성능을 저하시키는 이유는 무엇입니까?

JavaScript에서 객체의 [[프로토타입]]을 수정하는 것이 성능을 저하시키는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-30 20:09:03473검색

Why is Modifying an Object's [[Prototype]] a Performance Killer in JavaScript?

객체의 [[프로토타입]]을 수정하는 것이 성능을 저하시키는 이유는 무엇입니까?

MDN(Mozilla 개발자 네트워크)에서는 객체를 변경하지 말 것을 강력히 권고합니다. 사용된 방법에 상관없이 객체의 [[프로토타입]]. 이 경고는 최신 JavaScript 구현에서 발생하는 심각한 성능 저하에서 비롯됩니다.

Function.prototype을 통해 JavaScript 클래스에 멤버 함수를 추가하는 것이 권장되지만 다음 작업은 모두 수행됩니다.

foo.__proto__.bar = bar;
Foo.prototype.bar = bar;

기능적으로 동일하고 Object.getPrototypeOf(foo)` 객체에 'bar 속성을 생성합니다.

문제는 'bar` 속성을 생성하는 것이 아니라 '__proto__ 속성 ​​자체에 할당하는 데 있습니다.

fred.__proto__ = Object.prototype;

이 작업은 속성 액세스에 대한 JavaScript 엔진 최적화를 중단합니다. 기존 객체의 프로토타입 체인을 수정하면 이전의 모든 최적화 노력이 효과적으로 파괴됩니다.

예를 들어 V8 JavaScript 엔진은 숨겨진 클래스를 활용하여 속성 조회를 최적화합니다. 프로토타입 체인을 변경하면 이러한 최적화가 무효화되어 엔진이 덜 효율적인 방법으로 돌아가게 됩니다.

현장 전문가들은 변경 가능한 프로토타입이 성능에 미치는 영향에 대해 우려를 표명했습니다.

  • Brendan Eich: "쓰기 가능한 proto는 구현하기가 엄청나게 고통스럽습니다... 그리고 온갖 종류의 유형 혼란 위험을 야기합니다."
  • Brian Hackett: "스크립트 허용 프로토타입을 변경하면... 스크립트의 동작에 대해 추론하기가 더 어려워지고 VM, JIT 및 분석 구현이 더욱 복잡하고 버그가 많아집니다."
  • Jeff Walden: "생성 후 프로토타입 변형은 불규칙한 성능 불안정화, 프록시 및 [[SetInheritance]]"

에 미치는 영향

동의는 분명합니다. 객체의 [[Prototype]]을 변경하는 것은 성능 최적화에 지장을 주기 때문에 피해야 합니다. 대신 Object.create()를 사용하여 고유한 프로토타입 체인으로 새 객체를 생성하는 것이 선호되는 접근 방식입니다.

위 내용은 JavaScript에서 객체의 [[프로토타입]]을 수정하는 것이 성능을 저하시키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.