일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 데이터분석
- 알고리즘
- 네트워크보안
- 2
- 사이버보안
- 컴퓨터비전
- 컴퓨터과학
- 데이터베이스
- 컴퓨터공학
- 보안
- 데이터과학
- 머신러닝
- 클라우드컴퓨팅
- 데이터구조
- 자바스크립트
- I'm Sorry
- 네트워크
- 딥러닝
- 버전관리
- 웹개발
- 소프트웨어공학
- 빅데이터
- 프로그래밍언어
- Yes
- 자료구조
- 파이썬
- 코딩
- 소프트웨어
- 프로그래밍
- 인공지능
- Today
- Total
스택큐힙리스트
Object.prototype is Verboten?객체.prototype은 금지되었습니까? 본문
기본적으로, 이것은 당신이 함수에 안전하게 유지하거나 반복해서 작성할 수 있는 같은 구현된 for...in
루프입니다. 저는 이것이 모든 객체에 추가될 것이라는 것을 알고 있으며, 사실 거의 모든 JavaScript 상속 체인은 Object.prototype
으로 역추적할 수 있기 때문에, 하지만 저의 스크립트에서는 두 가지 악 중에 덜한 것으로 간주합니다.
어쩌면 더 잘못된 부분을 제대로 알려주는 사람들이 있을 수도 있습니다. 이 분을 포함하여 기타 사람들이. 사람들이 Object의 프로토타입에 손을 대지 말아야 하는 이유를 찾아볼 때, 하나의 것이 계속해서 나오는데, for..in
루프-뭔가가 깨진다는 것입니다. 그러나 사실 많은 프레임워크들도 그렇고, 여러분의 자체 상속 체인도 마찬가지입니다. 그러므로 객체의 속성을 순환할 때 .hasOwnProperty
확인을 포함시키지 않는 것은 잘못된 관행입니다.
저는 이 또한 흥미롭다고 생각했습니다. 다시 말하지만, 한 코멘트는 명확하게 '원시 객체의 확장은 나쁜 습관이다' 라고 말합니다. 그런데 만약 V8 개발자들이 그렇게 한다면, 제가 그들이 틀렸다고 말할 권리가 있을까요?
아시다시피, 그러한 주장은 그다지 타당하지 않습니다.
문제는: 위의 코드에 실제로 문제가 없다는 점입니다. 저는 이 코드를 좋아하고 많이 사용하며, 지금까지 한 번도 실망시키지 않았습니다. 실제로 Object 프로토타입에 몇 가지 함수를 추가해보려고도 합니다. 그러나 그렇게 하지 말아야 할 이유가 있다면, 어떤 이가 알려주길 바랍니다.
답변 1
내 예제에서는 getProperties
를 Object.prototype
에 추가하지 않을 것입니다. 대신 getPrototypeOf
와 유사한 방식으로 Object
에 추가하고 객체를 인수로 받겠습니다.
Array.prototype
를 확장하는 것 때문에 Prototype 라이브러리가 많은 비난을 받는다는 것을 알고 계셔야 합니다. 그것은 for..in
루프에 어떤 영향을 미치는지에 대한 것입니다. 그리고 그것은 단지 Array
뿐입니다 (for..in
을 사용해서는 안됩니다 (아마도 hasOwnProperty
가드 및 아마도 String(Number(name)) === name
도 사용할 것입니다).
...만약 V8 개발자들이 그렇게 한다면, 나는 그들이 틀렸다고 말할 자격이 없다.
V8에서는 Object.defineProperty
에 의존할 수 있습니다. 왜냐하면 V8은 완전한 ES5 호환 엔진이기 때문입니다.
속성이 열거할 수 없을 때에도 문제가 있다는 것을 유념하세요. 몇 년 전에, Prototype(간접적으로)는 Array.prototype
에 filter
함수를 정의했습니다. 그리고 원하는 대로 동작합니다: 이터레이터 함수를 호출하고 함수가 선택한 요소를 기반으로 새로운 배열을 생성합니다. 그런데 ECMAScript5가 등장하면서 거의 동일한 작업을 수행하는 Array.prototype.filter
를 정의했습니다. 그런데 문제는 여기에 있습니다: 매우 유사한 작업을 합니다. 특히, 호출되는 이터레이터 함수의 시그니처가 다릅니다(ECMAScript5에는 Prototype에 없던 인수가 포함됩니다). 그것보다 훨씬 안 좋아질 수도 있었을 것이며 (그리고 제 생각으로는, TC39이 Prototype을 인지하고 의도적으로 충돌을 최소화한 것 같습니다만 확인할 수는 없습니다).
그러니: 만약 그렇게 하려고 한다면, 위험과 비용을 알고 계셔야 합니다. 외부 라이브러리를 사용하려고 시도하다가 발생하는 추악하고 특별한 예외 상황 버그는 실제로 시간과 비용을 많이 들일 수 있습니다...
답변 2
Object.prototype은 금지됐다?자바스크립트에서 Object.prototype은 자바스크립트 언어에서 사용되는 기본 객체인 Object의 프로토타입이다. 많은 개발자들은 자바스크립트 애플리케이션의 구조를 간단하고 효율적으로 만들고자 할 때 Object.prototype을 활용해왔다. 그러나 최근에는 이러한 사용이 권장되지 않는다고 여겨지고 있다.
Object.prototype을 사용하는 것은 언어의 일관성과 유지보수에 문제를 일으킬 수 있다. Object.prototype은 모든 객체에서 공유되는 프로퍼티이므로, 해당 프로퍼티를 수정하면 이를 상속받은 모든 객체에 영향을 미친다. 이로 인해 코드의 예상치 못한 동작이 발생할 수 있으며, 디버깅이 어려워질 수도 있다.
또한, Object.prototype을 수정하면 다른 라이브러리와의 호환성 문제가 발생할 수 있다. 많은 자바스크립트 라이브러리들은 Object.prototype의 변경사항을 고려하지 않고 만들어져 있기 때문에, 이와 충돌하는 상황이 발생할 수 있다. 이는 코드의 예기치 않은 버그와 호환성 문제를 일으킬 수 있으며, 수정하기 어려운 상황에 놓일 수도 있다.
더욱이, Object.prototype을 수정하면 프로토타입 체인에 대한 이해가 필요하다. 프로토타입 체인은 자바스크립트의 핵심 개념 중 하나인데, 이를 이해하지 못하고 Object.prototype을 사용하면 코드의 복잡성이 증가한다.
따라서, 최근 자바스크립트 커뮤니티에서는 Object.prototype의 사용을 권장하지 않는다. 코드의 유지보수를 용이하게 하고 예상치 못한 동작을 방지하기 위해서는 다른 방법을 탐색해야 한다. 여러 자바스크립트 라이브러리들을 사용하거나 팀원들과 협업할 때도 충돌을 피하기 위해 Object.prototype을 사용하지 않는 것이 좋다.
결론적으로, Object.prototype는 자바스크립트에서는 금지되는 것으로 여겨져야 한다. 코드의 일관성과 호환성을 위해서는 이를 사용하지 않고 다른 대안을 찾는 것이 중요하다. 이를 통해 좀 더 효율적이고 확장 가능한 자바스크립트 애플리케이션을 구축할 수 있다.