JavaScript는 프로토 타입의 상속에 널리 사용되는 유일한 언어이므로 두 상속 방법의 차이점을 이해하는 데 시간이 걸립니다.
첫 번째 주요 차이점은 JavaScript가 프로토 타입 체인을 사용하여 상속한다는 것입니다.
funture foo () {this.value = 42;} foo.prototype = {method : function () {}}; function bar () {}Bar의 프로토 타입을 Foo의 개체 인스턴스로 설정하십시오.
bar.prototype = new foo (); bar.prototype.foo = 'Hello World';
막대의 생성자가 자체인지 확인하고 새 막대 개체 인스턴스를 만듭니다.
bar.prototype.constructor = bar; var test = new bar ();
전체 프로토 타입 체인의 구성을 살펴 보겠습니다.
테스트 [bar의 인스턴스] bar.prototype [foo의 인스턴스] {foo : 'hello world'} foo.prototype {method : ...} object.prototype {tostring : ... / * 등 * /}위의 예에서 객체 테스트는 Bar.prototype 및 foo.prototype을 모두 상속합니다. 따라서 foo에 정의 된 함수 메소드에 액세스 할 수 있습니다. 물론 속성 값에도 액세스 할 수 있습니다. New Bar ()가 생성되지 않으면 새 FOO 인스턴스가 재사용되지만 프로토 타입 객체와 함께 제공되는 FOO 인스턴스가 재사용된다고 언급해야합니다. 마찬가지로 모든 막대 인스턴스는 동일한 값 속성을 공유합니다. 예를 들어 보자 :
test1 = new bar (); test2 = new bar (); bar.prototype.value = 41; test1.value // 41 test2.value // 41
프로토 타입 체인 검색 메커니즘
객체의 속성에 액세스 할 때 JavaScript는 해당 속성을 찾을 때까지 전체 프로토 타입 체인을 물체 자체에서 통과합니다. 위의 예제에서 프로토 타입 인 프로토 타입 체인의 상단에 도달하면 여전히 발견 할 속성이 없으면 JavaScript는 정의되지 않은 값을 반환합니다.
프로토 타입 객체의 특성
프로토 타입 객체의 특성은 JavaScript에 의해 프로토 타입 체인을 작성하는 데 사용되지만 여전히 값을 할당 할 수 있습니다. 그러나 원래 값을 프로토 타입에 복사하는 것은 다음과 같이 유효하지 않습니다.
함수 foo () {} foo.prototype = 1; // 효과가 없습니다다음은이 기사에서 산만 해지고 원래 가치가 무엇인지 소개합니다.
JavaScript에서 변수는 원래 값과 참조 값과 같은 두 가지 유형의 값을 저장할 수 있습니다.
1. 원시적 값 :
원래 값은 고정되고 간단한 값이며, 스택에 저장된 간단한 데이터 세그먼트, 즉 값은 변수에 액세스하는 위치에 직접 저장됩니다.
원시 유형에는 정의되지 않은, 널, 부울, 숫자, 문자열의 5 가지 유형이 있습니다.
2. 참조 값 :
참조 값은 비교적 큰 물체이며, 힙 힙에 저장된 물체, 즉 변수에 저장된 값은 객체가 저장되는 메모리를 가리키는 포인터 포인터입니다. 모든 참조 유형은 객체에서 통합됩니다.
프로토 타입 체인 성능 문제
찾은 속성이 프로토 타입 체인의 상단에 있으면 검색 프로세스는 의심 할 여지없이 성능에 부정적인 영향을 미칩니다. 이는 성능 요구 사항이 필요한 시나리오에서 중요한 고려 사항이 될 것입니다. 또한 존재하지 않는 속성을 찾으려고하면 전체 프로토 타입 체인이 횡선됩니다.
마찬가지로, 객체의 특성을 가로 질러 가면 프로토 타입 체인의 모든 특성에 액세스됩니다.
요약
프로토 타입 상속을 이해하는 것은보다 복잡한 JavaScript 코드를 작성하기위한 전제 조건이며, 코드의 프로토 타입 체인의 높이에주의를 기울여야합니다. 성능 병목 현상에 직면 할 때 프로토 타입 체인을 분할하는 법을 배워야합니다. 또한, 프로토 타입 객체 프로토 타입을 프로토 타입 __proto__와 구별하기 위해, 우리는 주로 프로토 타입 객체 프로토 타입에 대해 논의 할 것이며, 프로토 타입 __proto__에 대한 문제를 설명하지 않을 것입니다.