paint-brush
JavaScript 객체: 기초부터 고급 기술까지~에 의해@smakss
3,712 판독값
3,712 판독값

JavaScript 객체: 기초부터 고급 기술까지

~에 의해 Max Kazemi17m2024/03/07
Read on Terminal Reader

너무 오래; 읽다

JS 객체 살펴보기: 유형을 이해하고, 객체를 생성 및 관리하고, 동등성 검사, 프로토타입 상속을 자세히 알아보고, 주요 유틸리티 기능을 활용합니다.
featured image - JavaScript 객체: 기초부터 고급 기술까지
Max Kazemi HackerNoon profile picture
0-item
1-item
2-item

JavaScript의 핵심 이해: 기본 요소 및 객체

다양하고 유연한 데이터 유형의 언어인 JavaScript는 기본적으로 PrimitivesObjects 의 두 가지 범주로 나뉩니다. 이러한 구별은 JavaScript가 작동하는 기반을 형성하므로 모든 수준의 개발자가 파악하는 데 중요합니다. 우리의 이해를 확고히 하기 위해 이러한 개념을 다시 살펴보겠습니다.


원시 값: 기본

  • 문자열 : "hello""farewell" 과 같은 텍스트 데이터는 따옴표로 캡슐화되어 JavaScript에서 텍스트 조작을 위한 초석 역할을 합니다.


  • 숫자 : 정수( -5 )이든 소수( 3.14 )이든 숫자는 언어의 수학 연산의 기반입니다.


  • BigInt : Number의 안전한 정수 제한을 넘어서는 계산의 경우 BigInt가 사용되어 큰 정수에 대한 정확한 산술이 가능합니다.


  • Boolean : true 및 false 값을 갖는 Boolean 유형은 논리 연산 및 제어 흐름에 중추적인 역할을 합니다.


  • 정의되지 않음 : 값이 할당되지 않은 변수에는 자동으로 정의되지 않은 값이 부여되며, 이는 특정 컨텍스트에 값이 없음을 나타냅니다.


  • 기호 : 고유한 속성 키를 보장하기 위해 도입된 기호는 변경할 수 없고 고유하며 충돌하지 않는 속성을 객체에 추가하는 데 이상적입니다.


  • Null : 객체 값이 의도적으로 없음을 나타냅니다. 정의되지 않음과 달리 null은 '값 없음'을 나타내기 위해 명시적으로 할당됩니다.


기본 요소는 변경할 수 없습니다 . 즉, 일단 생성되면 해당 값을 변경할 수 없습니다. 이러한 특성은 종종 혼란을 야기합니다. 특히 값 자체에 대한 기본 값을 보유하는 변수를 착각할 때 더욱 그렇습니다.


기본 요소가 불변이라는 점을 이해하면 특히 비교 및 할당 작업에서 JavaScript 동작의 여러 측면을 명확하게 하는 데 도움이 됩니다.


JavaScript를 통한 여정에서 이러한 유형 중 일부를 직접 사용하지는 않지만 해당 역할을 인식하고 이해하면 코딩 툴킷이 풍부해지고 보다 정교하고 효율적인 코드를 위한 길을 닦을 수 있습니다.


기본 요소의 영역을 넘어 JavaScript의 세계는 객체에 의해 지배됩니다. 이 범주에는 광범위한 데이터 구조가 포함되며 그 중 일부는 Arrays 와 같이 여러분을 놀라게 할 수도 있습니다. 주로 다음과 같은 문제가 발생합니다.


  • 객체 : 표준 객체의 경우 {} , 배열의 경우 [] 로 표시되는 이러한 구조는 관련 데이터 및 기능을 그룹화하기 위한 백본입니다.


  • 함수 : 무엇보다도 x => x * 2 로 표현되는 함수는 JavaScript의 일급 시민으로서 코드를 변수에 할당하거나 인수로 전달하거나 다른 함수에서 반환할 수 있습니다.


객체는 기본 요소와 근본적으로 다릅니다. 이는 변경 가능하며 코드에서 직접 조작할 수 있습니다. 일반적인 오해는 JavaScript의 모든 것을 객체로 보는 것입니다. 이는 기본 값의 특정 객체와 유사한 동작으로 인해 부분적으로 사실입니다. 예를 들어 "hi".toUpperCase() 라는 표현은 다음과 같은 질문을 제기할 수 있습니다. 기본 문자열에 어떻게 메서드가 있을 수 있습니까?


이는 "박싱" 이라고 알려진 프로세스를 통해 발생합니다. 여기서 JavaScript는 일시적으로 객체 래퍼의 기본 값을 래핑하여 메서드에 액세스하고 작업이 완료되면 이러한 객체를 삭제합니다.


이는 JavaScript 디자인의 매력적인 측면으로, 기본 요소가 실제로 객체가 되지 않고도 객체와 유사한 메서드의 이점을 누릴 수 있도록 해줍니다. JavaScript의 유형을 더 깊이 탐구할 때 이러한 차이점을 이해하는 것이 중요합니다.

JavaScript의 연산자 typeofnull 의 고유 사례 탐색

JavaScript에서 다양한 데이터 유형을 구별하는 것은 때때로 마법처럼 느껴질 수 있습니다. 주어진 값의 유형을 표시하는 JavaScript 툴킷의 강력한 도구인 typeof 연산자를 입력하십시오. 실제로 작동하는 방법은 다음과 같습니다.


 console.log(typeof(5)); // Outputs "number" console.log(typeof("hi")); // Outputs "string" console.log(typeof(undefined)); // Outputs "undefined" console.log(typeof({})); // Outputs "object" console.log(typeof([])); // Outputs "object" console.log(typeof(x => x * 2)); // Outputs "function"


그러나 JavaScript 영역에서는 모든 것이 보이는 대로 나타나는 것은 아닙니다. 예를 들어 typeof 연산자의 null 처리를 살펴보겠습니다. 기대에도 불구하고 typeof null "object" 반환하는데, 이는 많은 개발자를 당황하게 만듭니다. 이 동작은 버그라기보다는 JavaScript의 초기 디자인 결정에 뿌리를 둔 언어의 변덕입니다.


null 값은 의도적으로 객체 값이 없음을 나타내기 위한 것이지만 typeof 이를 객체로 분류합니다. 이 특징은 잘 알려져 있으며 이전 버전과의 호환성에 대한 우려로 인해 JavaScript가 발전하는 동안 지속되었습니다.


할당되지 않은 값을 나타내는 undefined 과 달리 null '값 없음'의 의도적인 할당을 나타내기 위해 명시적으로 사용된다는 점을 기억하는 것이 중요합니다. JavaScript는 nullundefined 간의 사용법을 구분하지 않지만, 코드에 대한 일관된 접근 방식을 채택하면 의도를 명확하게 하고 가독성과 유지 관리 가능성 모두에 도움이 될 수 있습니다.

JavaScript의 표현식 이해: 코드와의 대화

역동적인 JavaScript 세계에서 코드 작성은 질문을 던지는 것과 유사하며, 언어는 답변으로 응답합니다. 이러한 상호 작용은 우리가 표현이라고 부르는 것을 통해 포착됩니다. JavaScript의 표현식은 값으로 확인되는 유효한 코드 단위입니다.


간단한 예를 살펴보겠습니다.


 console.log(5 + 5); // Outputs 10


이 경우 5 + 5 는 자바스크립트가 10 값으로 평가하는 표현식입니다.


표현식은 프로그램 내에서 동적 상호 작용과 계산을 가능하게 하는 JavaScript 코드의 구성 요소입니다. 위의 예처럼 간단할 수도 있고 더 복잡할 수도 있습니다. 실제로 표현식은 대화형의 동적 웹 애플리케이션을 만들기 위한 언어와의 직접적인 통신 수단입니다.

JavaScript에서 객체 생성: 호출에서 가비지 수집까지

문자열, 숫자, 부울과 같은 JavaScript의 기본 데이터 유형은 미리 정의된 엔터티로 호출되지만 객체는 다른 원리에 따라 작동합니다. {} (중괄호)를 사용할 때마다 단순히 기존 청사진을 참조하는 것이 아닙니다. 우리는 아주 새로운 물체를 존재하게 만들고 있습니다. 두 개의 간단한 객체 생성을 고려하십시오.


 const cat = {}; const dog = {};


여기서 catdog 서로 다른 개체이며, 각각 기억 속에 자신만의 공간을 갖고 있습니다. 이 원칙은 단순한 객체 리터럴을 넘어 배열, 날짜 및 함수를 포함한 JavaScript의 모든 복잡한 데이터 구조를 포괄합니다.


이러한 엔터티를 생성하는 방법은 다양 하지만, 객체에는 {} , 배열에는 [] , 날짜에는 new Date() 사용하는 것이 객체 인스턴스를 생성하는 가장 직접적인 접근 방식 중 하나입니다.


하지만 더 이상 필요하지 않은 객체는 어떻게 되나요? JavaScript 세계에 무기한 남아 있습니까? 그 답은 더 이상 사용하지 않는 메모리를 효율적으로 정리하는 프로세스인 JavaScript의 가비지 수집 메커니즘 에 있습니다.


가비지 수집은 자동 작업입니다. 즉, 코드에 개체에 대한 참조가 없으면 개체가 파괴되고 할당된 메모리가 회수됩니다.

JavaScript의 값 비교: 표면 너머의 평등

JavaScript에서 값을 비교하는 것은 때때로 동일한 목적지, 즉 평등을 이해하는 다양한 경로로 미로를 탐색하는 것처럼 느껴질 수 있습니다. 값을 비교하는 세 가지 기본 방법은 다음과 같습니다.


  1. 엄격한 동등 ( === ): 이 동등 형식은 두 피연산자의 값과 유형을 모두 확인하는 가장 정확합니다. 이는 "이 두 값의 유형과 내용이 동일합니까?"라고 묻는 것과 같습니다.


  2. 느슨한 동등 ( == ): 엄격한 동등보다 덜 엄격하며, 느슨한 동등은 비교 전에 유형 강제를 허용합니다. 이는 "유형을 간과하면 이 두 값을 동일하게 간주할 수 있습니까?"라고 묻는 것과 같습니다.


  3. 동일 값 동일 ( Object.is ): 이 방법은 엄격한 동일과 유사하지만 특히 특별한 JavaScript 사례를 처리하는 방법에서 몇 가지 중요한 차이점이 있습니다.


Object.is 작동하는 모습을 살펴보겠습니다.


 console.log(Object.is(2, 2)); // true console.log(Object.is({}, {})); // false


Object.is({}, {}) false를 반환하는 이유는 무엇입니까? 각 객체 리터럴 {} 은 메모리에 고유한 객체를 생성하므로 Object.is 구조적 유사성에도 불구하고 이를 별개의 엔터티로 취급하게 됩니다.

엄격한 평등의 의미에 대해 자세히 알아보기

엄격한 동등성은 간단 하지만 특히 특정 JavaScript 값과 관련하여 고유한 특성 세트를 포함합니다.


  • NaN === NaN : 놀랍게도 이 비교는 false 반환합니다. JavaScript에서 NaN (Not-a-Number)은 정의되지 않거나 잘못된 계산의 결과를 알리기 위한 드문 특성인 자체와 동일하지 않은 것으로 간주됩니다.


  • -00 비교: -0 === 00 === -0 둘 다 true 반환합니다. 단, -00 은 JavaScript의 숫자 체계에서 서로 다른 값입니다. 이 평등은 크기에만 초점을 맞춰 0의 부호를 간과합니다.

실질적인 의미

정확하고 버그 없는 JavaScript 코드를 작성하려면 동등성 검사의 이러한 차이점을 이해하는 것이 가장 중요합니다. ===== 각자의 역할이 있지만 Object.is 언제 사용해야 하는지 아는 것이 중요할 수 있습니다. 특히 NaN , 0-0 과 관련된 극단적인 경우에는 더욱 그렇습니다.


이러한 지식을 통해 개발자는 동등성 검사에 대해 정보에 입각한 결정을 내릴 수 있으며 코드가 다양한 시나리오에서 예상대로 작동하도록 할 수 있습니다.

JavaScript에서 개체 속성 및 참조 탐색

JavaScript에서 객체 속성을 조작할 때 점 표기법대괄호 표기법 이라는 두 가지 기본 도구가 있습니다. 두 방법 모두 객체의 내용에 액세스하고 수정할 수 있는 간단한 경로를 제공합니다. 간단한 입문서는 다음과 같습니다.


  • 점 표기법 : 점 연산자(예: object.key )를 통해 속성에 직접 액세스합니다.


  • 대괄호 표기법 : 대괄호와 문자열을 사용하여 속성 이름을 지정합니다(예: object['key'] ).


이러한 기술은 객체와 상호 작용하기 위한 기초입니다. 그러나 이해해야 할 중요한 측면은 JavaScript가 객체 참조를 처리하는 방법입니다. 기본 데이터 유형과 달리 JavaScript의 객체는 참조 유형입니다. 즉, 객체를 조작할 때 객체 자체의 직접 복사본이 아닌 메모리 내 해당 객체의 위치에 대한 참조를 사용하여 작업한다는 의미입니다.

실제 일러스트레이션: 공동으로 코드 작성

이 개념을 생생하게 구현하기 위해 두 명의 야심찬 작가인 Emily와 Thomas가 공동으로 소설을 집필하는 시나리오를 고려해 보겠습니다. 그들은 스토리의 등장인물과 설정을 구조화하기 위해 JavaScript 개체를 사용하기로 결정했습니다.


 const project = { title: "Adventures in Code", characters: { protagonist: { name: "Alex", traits: ["brave", "curious"] } }, setting: { location: "Virtual World", era: "future" } };


스토리를 전개하면서 Emily는 주인공에게서 영감을 받았지만 독특한 반전이 있는 조수 캐릭터를 소개합니다.


 const sidekick = project.characters.protagonist; sidekick.name = "Sam"; sidekick.traits.push("loyal");


동시에 Thomas는 소설의 배경을 확장하기로 결정합니다.


 const newSetting = project.setting; newSetting.location = "Cyber City"; newSetting.era = "2040";


언뜻 보면 이러한 변경 사항이 원본 project 개체에 어떤 영향을 미치는지 궁금할 수 있습니다. 결과는 다음과 같습니다.


  • 이제 주인공의 이름은 '샘'으로 나타나고, 특징에는 '충성심'이 포함됩니다. 이는 sidekick 이 새로운 개체가 아니라 project.characters.protagonist 에 대한 참조이기 때문입니다. sidekick 수정하면 원본 project 개체에 직접적인 영향을 미칩니다.


  • 소설의 배경은 '2040년' '사이버시티'로 진화했다. 문자와 유사하게 newSetting project.setting 에 대한 참조입니다. 즉, newSetting 에 대한 모든 변경 사항은 project.setting 에 직접적인 영향을 미칩니다.

참조의 힘 이해하기

이 예는 JavaScript의 중추적인 개념을 강조합니다. 객체 작업은 참조 작업을 의미하며, 객체를 변수에 할당하면 해당 객체에 대한 참조를 할당하게 됩니다.


해당 참조를 통해 수정한 내용은 해당 개체에 대한 모든 참조에 반영됩니다. 이 동작은 복잡하고 상호 연결된 데이터 구조를 가능하게 하지만 의도하지 않은 부작용을 방지하려면 신중한 관리가 필요합니다.


우리의 이야기에서 Emily와 Thomas의 공동 작업 프로세스는 객체 참조가 코딩에서 창의적인 노력에 어떻게 도움이 되는지, 복잡한 내러티브의 공유되고 동적인 개발을 허용하는지, 더 실용적인 용어로 애플리케이션 내의 복잡한 데이터 구조를 가능하게 하는지를 아름답게 보여줍니다.

JavaScript의 객체 복사 마스터하기: 얕은 복사본과 깊은 복사본

JavaScript에서 개체를 작업할 때 직접 할당을 사용하면 참조 복사의 특성으로 인해 의도하지 않은 수정이 발생할 수 있습니다. 개체의 복사본을 만들면 원본 개체에 영향을 주지 않고 안전하게 조작할 수 있습니다. 이렇게 하면 의도하지 않은 수정을 완화할 수 있습니다.


요구 사항과 시나리오에 따라 얕은 복사본과 전체 복사본 중에서 선택할 수 있습니다.

얕은 복사 기술:

  • Object.sign : 이 메서드는 소스의 속성을 대상 객체( {} )에 복사하여 새 객체를 생성합니다. Object.assign 단순 복사를 수행한다는 점에 유의하는 것이 중요합니다. 즉, 중첩된 개체나 배열은 해당 값이 아닌 참조로 복사됩니다.


     const original = { a: 1, b: { c: 2 } }; const copy = Object.assign({}, original); copy.bc = 3; // Affects both 'copy' and 'original'


  • 확산 연산자 ( ... ): Object.assign 와 유사하게 확산 연산자는 원본 개체의 속성을 새 개체로 확장하여 얕은 복사본을 생성합니다.


     const copyUsingSpread = { ...original }; copyUsingSpread.bc = 4; // Also affects the 'original' object

깊은 복사 방법:

  • JSON.parseJSON.stringify : 이 접근 방식은 객체를 JSON 문자열로 직렬화한 다음 이를 다시 새 객체로 구문 분석합니다. 효과적으로 전체 복사본을 생성하지만 함수, Date 개체, 정의되지 않은 값 및 기타 직렬화할 수 없는 값을 처리할 수 없습니다.


     const deepCopy = JSON.parse(JSON.stringify(original)); deepCopy.bc = 5; // Does not affect the 'original' object


  • 라이브러리 : 더 복잡한 시나리오의 경우 Lodash와 같은 라이브러리는 JSON 메서드보다 더 효과적으로 다양한 데이터 유형을 처리하는 것을 포함하여 객체를 심층 복제할 수 있는 함수 (예: _.cloneDeep() )를 제공합니다.

실용적인 응용 프로그램

공동 작문 프로젝트 예시를 다시 살펴보겠습니다.


 const project = { title: "Adventures in Code", characters: { protagonist: { name: "Alex", traits: ["brave", "curious"] } }, setting: { location: "Virtual World", era: "future" } };


원본에 영향을 주지 않고 프로젝트를 수정하려면:

  • Deep Copy 의 경우 : JSON.parse(JSON.stringify(project)) 사용하여 안전하게 새 문자를 추가하거나 설정을 변경하세요.


  • 얕은 복사본 의 경우 : 중첩된 구조가 문제가 되지 않는 최상위 수준 변경에는 Object.assign 또는 스프레드 연산자를 사용하십시오.


얕은 복사본과 깊은 복사본 중에서 선택하는 것은 개체의 복잡성과 조작의 특정 요구 사항에 따라 달라집니다. 간단한 개체에는 얕은 복사본이 더 빠르고 적합하며, 중첩 구조가 있는 개체에는 원본 개체가 그대로 유지되도록 하는 깊은 복사본이 필요합니다.


이러한 대응 기술을 이해하고 적용함으로써 JavaScript의 참조 기반 시스템을 자신있게 탐색하여 데이터 조작이 정확하고 의도적임을 확인할 수 있습니다.

프로토타입: JavaScript의 숨겨진 상속 스레드

소설 속의 등장인물이 조상으로부터 특성을 상속받는 것처럼, JavaScript의 객체는 프로토타입으로부터 속성과 메서드를 상속받습니다. 이 개념은 Emily와 Thomas가 소설 "Adventures in Code"에서 탐구해 온 스토리텔링 기술을 반영합니다.


프로토타입에 대한 이해를 심화하기 위해 JavaScript의 상속 모델을 반영하는 새로운 문자 아크를 소개하면서 이야기를 계속해 보겠습니다.


소설의 세계에는 지혜와 언어의 숙달로 유명한 "고대 코더"로 알려진 전설적인 서기가 존재합니다. Emily와 Thomas는 차세대 코더를 대표하는 이 신화적인 인물을 기반으로 새로운 캐릭터 "Coder Leo"를 만들기로 결정했습니다.


 // The Ancient Coder, known for his profound wisdom const ancientCoder = { wisdom: 100 }; // Coder Leo, a young scribe in training const coderLeo = { __proto__: ancientCoder, age: 15 };


이 이야기에서 Coder Leo는 "The Prototype Chain"이라는 마법의 유산을 통해 The Ancient Coder와 직접 연결됩니다. 이러한 연결을 통해 레오는 조상의 지혜를 활용할 수 있습니다.


 console.log(coderLeo.wisdom); // 100


프로토타입 체인 덕분에 Coder Leo는 젊음에도 불구하고 The Ancient Coder의 지혜에 접근할 수 있습니다. 하지만 The Ancient Coder가 갖고 있지 않은 도전이나 특성에 직면하면 어떻게 될까요?


 console.log(coderLeo.courage); // undefined


이 상황은 JavaScript 프로토타입 시스템의 핵심 원칙을 보여줍니다. 객체에서 속성을 찾을 수 없으면 JavaScript는 프로토타입 체인을 검색하여 이를 찾습니다. 속성이 여전히 발견되지 않으면 해당 특성이 없음을 나타내는 undefined 값이 반환됩니다.


이야기를 더욱 발전시키기 위해 Emily와 Thomas는 후손에게 어떻게 고유한 특성을 추가하여 조상과 구별할 수 있는지 탐구합니다.


 // Introducing a unique trait to Coder Leo coderLeo.courage = 50; console.log(ancientCoder.courage); // undefined console.log(coderLeo.courage); // 50


여기에서 Coder Leo는 The Ancient Coder와는 다른 용기의 특성을 개발합니다. 이 변경 사항은 The Ancient Coder의 속성을 변경하지 않으며 JavaScript의 동적 특성 덕분에 객체(또는 캐릭터)가 프로토타입(또는 조상)과 독립적으로 어떻게 진화할 수 있는지 보여줍니다.


이야기 속의 이 이야기는 Emily와 Thomas의 소설을 발전시킬 뿐만 아니라 JavaScript의 프로토타입 기반 상속에 대해서도 조명합니다. 소설 속 등장인물처럼 사물도 조상으로부터 특성을 물려받을 수 있습니다. 그러나 그들은 또한 자신의 길을 개척하고 각자의 여정을 반영하는 고유한 속성을 개발할 수 있는 능력도 가지고 있습니다.

마술의 발견: 프로토타입과 내장 방법의 힘

Emily와 Thomas는 소설 "Adventures in Code"를 더 깊이 탐구하면서 신비한 장, 즉 고대 프로토스의 책을 발견했습니다. 그들이 발견한 이 책은 단순한 플롯 장치가 아니라 JavaScript의 프로토타입과 내장 메소드를 이해하기 위한 은유였습니다. 이는 스토리의 세계와 코딩에 대한 이해에 마법의 층을 추가하는 개념입니다.


소설의 가상 배경인 Scriptsville에서는 모든 캐릭터와 사물에 Tome of Protos의 능력이 스며들어 있습니다. 이 마법의 책은 객체가 속성과 메소드를 상속하는 JavaScript의 프로토타입과 유사한 모든 지식과 기술의 원천입니다.


 // A seemingly ordinary quill in Scriptsville const quill = {};


Emily는 자신의 캐릭터 Ellie를 통해 이 깃펜을 탐색하다가 마법의 스레드를 통해 Protos의 고서에 연결되어 있음을 발견했습니다. 이는 JavaScript 객체의 __proto__ 속성과 직접적으로 유사하여 이를 프로토타입에 연결합니다.


 console.log(quill.__proto__); // Reveals the Tome's ancient scripts!


이 계시를 통해 Ellie는 hasOwnPropertytoString 호출하는 기능을 포함하여 Tome의 지혜에 접근할 수 있으며 Object 프로토타입에서 상속된 JavaScript의 내장 메서드를 시연할 수 있습니다.


그런 다음 내러티브는 마법에 걸린 도넛으로 유명한 제빵사인 마스터 도노반(Master Donovan)이라는 토마스의 캐릭터를 소개합니다. 자신의 요리 재능을 공유하기 위해 Donovan은 JavaScript에서 생성자 함수를 정의하는 것과 유사한 주문을 만듭니다.


 function EnchantedDoughnut() { this.flavor = "magic"; } EnchantedDoughnut.prototype.eat = function() { console.log("Tastes like enchantment!"); };


Donovan이 만든 모든 도넛에는 마법의 본질이 담겨 있어 이를 먹는 사람은 누구나 마법을 경험할 수 있습니다. 이야기의 이 부분에서는 Donovan의 도넛이 먹을 수 있는 능력을 상속받는 것처럼 JavaScript에서 생성자 함수로 생성된 개체가 생성자의 프로토타입에서 메서드를 상속하는 방법을 보여줍니다.


Scriptsville이 발전함에 따라 마법도 발전하여 고대 주문에서 현대 클래스 구문 기술로 전환됩니다. Emily와 Thomas는 새로운 구문으로 Donovan의 기술을 재구상하여 그의 마법에 더 쉽게 접근할 수 있도록 하고 JavaScript의 현대적인 관행에 맞춰 조정합니다.


 class ModernEnchantedDoughnut { constructor() { this.flavor = "modern magic"; } eat() { console.log("Tastes like modern enchantment!"); } }


이러한 전환은 Donovan의 베이킹 기술을 업데이트할 뿐만 아니라 JavaScript의 진화를 반영하여 기본 프로토타입 기반 상속을 유지하면서 클래스 구문의 우아함과 효율성을 강조합니다.

우리는 에밀리와 토마스에게서 무엇을 배웠나요?

"Adventures in Code" 제작을 통한 Emily와 Thomas의 여정은 프로토타입, 내장 메소드 및 JavaScript 자체의 진화를 이해하는 데 대한 매혹적인 비유가 됩니다.


캐릭터와 스토리를 통해 그들은 매력적이고 심오한 방식으로 복잡한 개념을 조명하여 모든 JavaScript 개체와 마찬가지로 모든 개체와 캐릭터가 더 크고 상호 연결된 상속과 혁신의 태피스트리의 일부임을 보여줍니다.


그들의 이야기는 스토리텔링과 프로그래밍 모두에서 근본적인 진실을 강조합니다. 과거를 이해하는 것은 현재를 마스터하고 미래를 위해 혁신하는 데 필수적입니다.


고대 고서, 마법에 걸린 도넛, 현대 마법이 있는 Scriptsville의 마법 세계는 JavaScript 프로토타입 시스템의 깊이와 상속의 힘을 탐구하기 위한 생생한 배경 역할을 합니다.

Scriptsville의 마법 유틸리티: 물체에 마법을 부여하고 조화를 보장

Emily와 Thomas는 소설 Adventures in Code를 더 깊이 탐구하면서 캐릭터, 설정, 마법 아이템으로 가득 찬 복잡한 세계를 관리할 방법이 필요하다는 것을 깨달았습니다.


그들은 마법을 부여하고 땅 전체의 조화를 보장하는 데 대한 전문 지식으로 유명한 Scriptsville의 현명한 서기인 Ellie에게 도움을 요청했습니다.

길의 마법: 중첩된 현실 보장

Ellie는 그들의 세계 내에 중첩된 영역의 존재를 보장할 수 있는 마법의 공식인 ensureObjectPath 그들과 공유했습니다.


 function ensureObjectPath({obj, path}) { path.split('.').reduce((acc, part) => { if (!acc[part]) acc[part] = {}; return acc[part]; }, obj); return obj; } // Ensuring the path to a hidden forest in their novel const world = {}; ensureObjectPath({obj: world, path: 'hidden.forest.clearing'}); console.log(world); // Outputs: { hidden: { forest: { clearing: {} } } }


Ellie는 이 마법을 사용하면 소설의 세계에서 어떤 위치든 만들 수 있으므로 각 캐릭터가 존재하지 않는 영역으로 모험을 떠나는 것에 대한 두려움 없이 퀘스트를 시작할 수 있다고 설명했습니다.

필수 요소 스크롤: 캐릭터의 필수 요소 보장

또한 Ellie는 모든 캐릭터가 여행에 필요한 필수 속성을 보유하도록 설계된 또 다른 주문 checkForRequiredKeys 소개했습니다.


 const REQUIRED_KEYS = ['age', 'address', 'gender']; function checkForRequiredKeys(obj) { REQUIRED_KEYS.forEach(key => { if (!Object.hasOwn(obj, key)) { obj[key] = {}; } }); } // Ensuring every character has the essential attributes const character = { name: "Ellie" }; checkForRequiredKeys(character); console.log(character); // Outputs: { name: "Ellie", age: {}, address: {}, gender: {} }


이 주문을 통해 Emily와 Thomas는 캐릭터에 복잡성을 엮어 이야기가 아무리 복잡하더라도 세부 사항이 간과되지 않도록 할 수 있었습니다.

Scriptsville의 메아리: 마법에서 깨달음까지

그들의 이야기가 전개되면서 Ellie가 공유한 마법은 "Adventures in Code"를 풍성하게 했을 뿐만 아니라 JavaScript의 객체 조작 및 구조의 기본 원리를 조명했습니다.


중첩된 현실 생성을 위해 ensureObjectPath 주문이 허용된 것처럼 JavaScript 개발자는 애플리케이션 내에서 데이터를 구조화하는 데 유사한 힘을 사용합니다.


마찬가지로 checkForRequiredKeys 주문은 데이터 무결성을 보장하는 데 필수적인 방어 프로그래밍 방식을 반영합니다.

결론

Scriptsville의 매혹적인 영역을 헤매는 동안 Emily, Thomas, Ellie 및 다양한 마법의 존재들이 우리의 동반자가 되어 땅 자체만큼 매혹적인 방식으로 JavaScript의 비밀을 밝혀냈습니다.


모험과 발견에 대한 이야기를 통해 우리는 가장 단순한 구문부터 표면 아래에서 작동하는 복잡한 엔진에 이르기까지 JavaScript의 핵심을 깊이 파고들었습니다.


스토리텔링의 마법이 프로그래밍의 논리와 결합되어 JavaScript 세계의 다층적인 경이로움을 드러내는 여타와는 다른 여정이었습니다.


  • 기본 유형과 객체 유형 : 우리는 JavaScript의 기본 유형과 객체 유형을 구별하는 것부터 시작하여 이러한 구성 요소가 언어의 기초를 형성하는 방법을 밝힙니다. 캐릭터의 탐색을 통해 우리는 기본 요소의 불변적 특성과 객체의 동적, 참조 기반 특성을 이해했습니다.


  • 객체 생성 및 비교 : 객체 생성, 값 비교, JavaScript의 동등성 뉘앙스에 대해 배웠습니다. Scriptsville의 마법 유물과 주문은 엄격한 평등( === ), 느슨한 평등( == ) 및 미묘한 비교를 위한 Object.is 사용을 이해하는 것의 중요성을 조명했습니다.


  • 객체 속성 및 프로토타입 : 객체 속성을 탐구하면서 우리는 객체 상속에서 프로토타입의 중추적인 역할과 함께 속성에 액세스하고 수정하기 위한 점 및 대괄호 표기법의 힘을 발견했습니다.


    Scriptsville의 상속 전선과 마법이 부여된 두루마리 이야기는 프로토타입 체인에 생명을 불어넣어 개체가 특성을 상속하고 재정의하는 방법을 보여줍니다.


  • 객체용 유틸리티 함수 : 마지막으로 객체 구조를 조작하고 데이터 무결성을 보장하는 유틸리티 함수를 살펴보았습니다. ensureObjectPathcheckForRequiredKeys 와 같이 Ellie가 공유한 마법의 공식은 중첩된 객체로 작업하고 필수 속성이 있는지 확인하는 실용적인 기술을 보여주었습니다.


Scriptsville의 이야기를 통해 우리는 JavaScript의 기능이 마술적이고 논리적이어서 개발자에게 창의성과 문제 해결을 위한 광대한 놀이터를 제공하는 방법을 살펴보았습니다.


Scriptsville의 매혹적인 이야기는 단순한 이야기 그 이상입니다. 이는 프로그래밍의 예술성에 대한 은유이며, 디지털 세계를 능숙하게 만들기 위해 JavaScript의 핵심 원칙을 이해하는 것의 중요성을 강조합니다.


이 여행에 대한 책을 마무리하면서 모험은 여기서 끝나지 않는다는 점을 기억하세요. 우리가 탐구한 각 개념은 JavaScript에 대한 더 깊은 이해와 숙달을 위한 디딤돌입니다.


Emily와 Thomas가 "Adventures in Code" 이야기를 썼던 것처럼, 여러분도 무한한 프로그래밍 세계에서 자신만의 이야기, 마법에 걸린 물건, 마법의 영역을 만들 수 있습니다.