javascript - js에서 생성자 패턴과 프로토타입 패턴을 결합하는 방법
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-05-19 10:33:10
0
5
649

고급 프로그래밍에서의 작성 방법은 다음과 같습니다

으아아아

이런 식으로 작성하면 생성자가 다르다는 것만 다를까요?

으아아아
曾经蜡笔没有小新
曾经蜡笔没有小新

모든 응답(5)
洪涛

프로토타입 정의(위치)를 생성자 내부에 작성하는 것과 생성자 외부에 작성하는 것의 차이점은 무엇인가요?

두 번째 작성 방법은 인스턴스가 생성될 때마다 프로토타입에 대한 작업을 수행하는 것입니다! 요점은 이 작업이 의미가 없으며 이 방법은 모든 인스턴스에 대해 동일하다는 것입니다.
첫 번째 방법은 생성자 외부에서 프로토타입을 작성할 때 반복되는 정의나 메모리 할당 문제를 형식적으로나 메모리 할당을 통해 모두 해결할 수 있습니다.
첫 번째 메모리 쓰기 방식에 해당하며, 인스턴스를 아무리 많이 생성하더라도 각 인스턴스는 이름, 나이, 직업, 수업만 차지합니다. 메모리에는 getName의 복사본이 하나만 있으며 모든 인스턴스가 공유합니다. 두 번째 작성 방법으로 새로 생성된 인스턴스는 프로토타입 정의를 실행하기 위해 추가 공간(스택)을 할당합니다.

첫 번째 방법과 두 번째 방법에서 프로토타입에 값을 할당하는 방식의 차이점은 무엇인가요?

큰 차이점은 일단 함수 클래스가 정의되면 기본 생성자 속성은 그 자체이며 해당 인스턴스는 생성자 속성에 액세스할 때 이 값을 반환한다는 것입니다.

으아악

메서드 1에서 생성자를 정의해야 하는 이유는 프로토타입을 다시 할당하기 때문입니다(Person.prototype = {getName: function() {}}). 위의 예p.constructor의 반환 값은 Object입니다. 즉, p의 생성자는 Object이며 이는 분명히 사실과 일치하지 않습니다. Person.prototype = {getName: function() {}}),那么上例中p.constructor返回值将是 Object, 即p的构造函数是Object,显然与事实不符。

方法1更明智的做法是不要重新给prototype赋值,只为prototype添加我们需要的属性getName, 改为 Person.prototype.getName = function() {return this.name;}

방법 1의 더 합리적인 접근 방식은 프로토타입을 다시 할당하는 것이 아니라 프로토타입에 필요한 getName 속성만 추가하고 이를 Person.prototype.getName = function() {return this.name;}으로 변경하는 것입니다. , 두 번째 메소드의 정의 메소드입니다. 이렇게 작성하면 프로토타입의 기본 속성이 덮어쓰여지지 않습니다. 🎜
習慣沉默

으아악

PHPzhong

이전 작성 방식은 프로토타입을 다시 작성하는 것이고, 귀하의 작성 방식은 프로토타입에 메소드를 추가하는 것뿐입니다

世界只因有你

작성 방식에 따라 각 인스턴스화 프로세스 중에 저장 공간이 인스턴스에 재할당됩니다. 프로토타입 패턴의 의미 중 하나는 그렇게 하더라도 모든 인스턴스가 프로토타입의 속성과 메서드를 공유할 수 있다는 것입니다. 혼자서는 결함이 있습니다. 두 번째 요점은 나는 여전히 프로토타입 객체 객체 리터럴을 작성하는 것을 선호한다는 것입니다. 저는 개인적으로 하나가 더 직관적이고 두 번째가 유지 관리에 도움이 된다고 생각합니다. 다음과 같습니다:

으아악

반드시 생성자 속성을 작성해야 합니다. 그렇지 않으면 포인팅 오류가 발생합니다. 이때 프로토타입 객체를 다시 작성하면 프로토타입 체인이 제 역할을 할 수 없습니다.

为情所困

프로토타입 상속과 생성자 사이에는 많은 차이점이 있습니다. 프로토타입 상속은 프로토타입 체인 상속입니다.

프로토타입 체인은 완벽하지 않으며 다음 두 가지 문제를 포함하고 있습니다.

질문 1: 프로토타입 체인에 참조 유형 값의 프로토타입이 포함되어 있으면 참조 유형 값은 모든 인스턴스에서 공유됩니다.

문제 2: 하위 유형을 생성할 때(예: Son 인스턴스 생성) 매개변수를 상위 유형 생성자(예: Father)에 전달할 수 없습니다.

이를 고려하여 실제로 프로토타입 체인은 단독으로 사용되는 경우가 거의 없습니다.

이를 위해 프로토타입 체인의 단점을 보완하기 위한 아래와 같은 시도가 있을 예정입니다.

생성자 차용

프로토타입 체인에서 위의 두 가지 문제를 해결하기 위해 우리는 생성자 차용 (생성자 훔치기)(클래식 상속이라고도 함)이라는 기술을 사용하기 시작했습니다.

기본 아이디어: 하위 유형 생성자 내에서 상위 유형 생성자를 호출합니다.

으아악

분명히 차용 생성자는 프로토타입 체인의 두 가지 주요 문제를 단번에 해결합니다.

첫째, 프로토타입 체인에서 참조 유형 값의 독립성을 보장하며 더 이상 모든 인스턴스에서 공유되지 않습니다.

둘째, 하위 유형을 생성할 때 상위 유형에 매개변수를 전달할 수도 있습니다.

이후 생성자만 빌리면 생성자 패턴의 문제를 피할 수 없게 됩니다. 메소드는 모두 생성자에 정의되어 있으므로 함수 재사용이 불가능하며 슈퍼타입 메소드도 정의됩니다. in (예: Father)도 하위 유형에 표시되지 않습니다. 이를 고려하면 생성자 차용 기술은 단독으로 사용되는 경우가 거의 없습니다.
자세한 내용은 JS 프로토타입 체인 및 상속을 참조하세요. 마음에 드신다면 엄지손가락을 치켜세우고 지지해 주세요. 감사합니다!

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿