프로토타입 정의(위치)를 생성자 내부에 작성하는 것과 생성자 외부에 작성하는 것의 차이점은 무엇인가요?
두 번째 작성 방법은 인스턴스가 생성될 때마다 프로토타입에 대한 작업을 수행하는 것입니다! 요점은 이 작업이 의미가 없으며 이 방법은 모든 인스턴스에 대해 동일하다는 것입니다. 첫 번째 방법은 생성자 외부에서 프로토타입을 작성할 때 반복되는 정의나 메모리 할당 문제를 형식적으로나 메모리 할당을 통해 모두 해결할 수 있습니다. 첫 번째 메모리 쓰기 방식에 해당하며, 인스턴스를 아무리 많이 생성하더라도 각 인스턴스는 이름, 나이, 직업, 수업만 차지합니다. 메모리에는 getName의 복사본이 하나만 있으며 모든 인스턴스가 공유합니다. 두 번째 작성 방법으로 각 새로 생성된 인스턴스는 프로토타입 정의를 실행하기 위해 추가 공간(스택)을 할당합니다.
첫 번째 방법과 두 번째 방법에서 프로토타입에 값을 할당하는 방식의 차이점은 무엇인가요?
큰 차이점은 일단 함수 클래스가 정의되면 기본 생성자 속성은 그 자체이며 해당 인스턴스는 생성자 속성에 액세스할 때 이 값을 반환한다는 것입니다.
으아악
메서드 1에서 생성자를 정의해야 하는 이유는 프로토타입을 다시 할당하기 때문입니다(Person.prototype = {getName: function() {}}). 위의 예p.constructor의 반환 값은 Object입니다. 즉, p의 생성자는 Object이며 이는 분명히 사실과 일치하지 않습니다. Person.prototype = {getName: function() {}}),那么上例中p.constructor返回值将是 Object, 即p的构造函数是Object,显然与事实不符。
방법 1의 더 합리적인 접근 방식은 프로토타입을 다시 할당하는 것이 아니라 프로토타입에 필요한 getName 속성만 추가하고 이를 Person.prototype.getName = function() {return this.name;}으로 변경하는 것입니다. , 두 번째 메소드의 정의 메소드입니다. 이렇게 작성하면 프로토타입의 기본 속성이 덮어쓰여지지 않습니다. 🎜
작성 방식에 따라 각 인스턴스화 프로세스 중에 저장 공간이 인스턴스에 재할당됩니다. 프로토타입 패턴의 의미 중 하나는 그렇게 하더라도 모든 인스턴스가 프로토타입의 속성과 메서드를 공유할 수 있다는 것입니다. 혼자서는 결함이 있습니다. 두 번째 요점은 나는 여전히 프로토타입 객체 객체 리터럴을 작성하는 것을 선호한다는 것입니다. 저는 개인적으로 하나가 더 직관적이고 두 번째가 유지 관리에 도움이 된다고 생각합니다. 다음과 같습니다:
으아악
반드시 생성자 속성을 작성해야 합니다. 그렇지 않으면 포인팅 오류가 발생합니다. 이때 프로토타입 객체를 다시 작성하면 프로토타입 체인이 제 역할을 할 수 없습니다.
프로토타입 상속과 생성자 사이에는 많은 차이점이 있습니다. 프로토타입 상속은 프로토타입 체인 상속입니다.
프로토타입 체인은 완벽하지 않으며 다음 두 가지 문제를 포함하고 있습니다.
질문 1: 프로토타입 체인에 참조 유형 값의 프로토타입이 포함되어 있으면 참조 유형 값은 모든 인스턴스에서 공유됩니다.
문제 2: 하위 유형을 생성할 때(예: Son 인스턴스 생성) 매개변수를 상위 유형 생성자(예: Father)에 전달할 수 없습니다.
이를 고려하여 실제로 프로토타입 체인은 단독으로 사용되는 경우가 거의 없습니다.
이를 위해 프로토타입 체인의 단점을 보완하기 위한 아래와 같은 시도가 있을 예정입니다.
생성자 차용
프로토타입 체인에서 위의 두 가지 문제를 해결하기 위해 우리는 생성자 차용 (생성자 훔치기)(클래식 상속이라고도 함)이라는 기술을 사용하기 시작했습니다.
기본 아이디어: 하위 유형 생성자 내에서 상위 유형 생성자를 호출합니다.
으아악
분명히 차용 생성자는 프로토타입 체인의 두 가지 주요 문제를 단번에 해결합니다.
첫째, 프로토타입 체인에서 참조 유형 값의 독립성을 보장하며 더 이상 모든 인스턴스에서 공유되지 않습니다.
둘째, 하위 유형을 생성할 때 상위 유형에 매개변수를 전달할 수도 있습니다.
이후 생성자만 빌리면 생성자 패턴의 문제를 피할 수 없게 됩니다. 메소드는 모두 생성자에 정의되어 있으므로 함수 재사용이 불가능하며 슈퍼타입 메소드도 정의됩니다. in (예: Father)도 하위 유형에 표시되지 않습니다. 이를 고려하면 생성자 차용 기술은 단독으로 사용되는 경우가 거의 없습니다. 자세한 내용은 JS 프로토타입 체인 및 상속을 참조하세요. 마음에 드신다면 엄지손가락을 치켜세우고 지지해 주세요. 감사합니다!
프로토타입 정의(위치)를 생성자 내부에 작성하는 것과 생성자 외부에 작성하는 것의 차이점은 무엇인가요?
두 번째 작성 방법은 인스턴스가 생성될 때마다 프로토타입에 대한 작업을 수행하는 것입니다! 요점은 이 작업이 의미가 없으며 이 방법은 모든 인스턴스에 대해 동일하다는 것입니다.
첫 번째 방법은 생성자 외부에서 프로토타입을 작성할 때 반복되는 정의나 메모리 할당 문제를 형식적으로나 메모리 할당을 통해 모두 해결할 수 있습니다.
첫 번째 메모리 쓰기 방식에 해당하며, 인스턴스를 아무리 많이 생성하더라도 각 인스턴스는 이름, 나이, 직업, 수업만 차지합니다. 메모리에는 getName의 복사본이 하나만 있으며 모든 인스턴스가 공유합니다. 두 번째 작성 방법으로 각 새로 생성된 인스턴스는 프로토타입 정의를 실행하기 위해 추가 공간(스택)을 할당합니다.
첫 번째 방법과 두 번째 방법에서 프로토타입에 값을 할당하는 방식의 차이점은 무엇인가요?
큰 차이점은 일단 함수 클래스가 정의되면 기본 생성자 속성은 그 자체이며 해당 인스턴스는 생성자 속성에 액세스할 때 이 값을 반환한다는 것입니다.
으아악메서드 1에서 생성자를 정의해야 하는 이유는 프로토타입을 다시 할당하기 때문입니다(
Person.prototype = {getName: function() {}}
). 위의 예p.constructor의 반환 값은Object
입니다. 즉, p의 생성자는 Object이며 이는 분명히 사실과 일치하지 않습니다.Person.prototype = {getName: function() {}}
),那么上例中p.constructor
返回值将是Object
, 即p的构造函数是Object,显然与事实不符。方法1更明智的做法是不要重新给prototype赋值,只为prototype添加我们需要的属性getName, 改为
방법 1의 더 합리적인 접근 방식은 프로토타입을 다시 할당하는 것이 아니라 프로토타입에 필요한 getName 속성만 추가하고 이를Person.prototype.getName = function() {return this.name;}
Person.prototype.getName = function() {return this.name;}으로 변경하는 것입니다.
, 두 번째 메소드의 정의 메소드입니다. 이렇게 작성하면 프로토타입의 기본 속성이 덮어쓰여지지 않습니다. 🎜으아악
이전 작성 방식은 프로토타입을 다시 작성하는 것이고, 귀하의 작성 방식은 프로토타입에 메소드를 추가하는 것뿐입니다
작성 방식에 따라 각 인스턴스화 프로세스 중에 저장 공간이 인스턴스에 재할당됩니다. 프로토타입 패턴의 의미 중 하나는 그렇게 하더라도 모든 인스턴스가 프로토타입의 속성과 메서드를 공유할 수 있다는 것입니다. 혼자서는 결함이 있습니다. 두 번째 요점은 나는 여전히 프로토타입 객체 객체 리터럴을 작성하는 것을 선호한다는 것입니다. 저는 개인적으로 하나가 더 직관적이고 두 번째가 유지 관리에 도움이 된다고 생각합니다. 다음과 같습니다:
으아악반드시 생성자 속성을 작성해야 합니다. 그렇지 않으면 포인팅 오류가 발생합니다. 이때 프로토타입 객체를 다시 작성하면 프로토타입 체인이 제 역할을 할 수 없습니다.
프로토타입 상속과 생성자 사이에는 많은 차이점이 있습니다. 프로토타입 상속은 프로토타입 체인 상속입니다.
프로토타입 체인은 완벽하지 않으며 다음 두 가지 문제를 포함하고 있습니다.
이를 고려하여 실제로 프로토타입 체인은 단독으로 사용되는 경우가 거의 없습니다.
이를 위해 프로토타입 체인의 단점을 보완하기 위한 아래와 같은 시도가 있을 예정입니다.
생성자 차용
프로토타입 체인에서 위의 두 가지 문제를 해결하기 위해 우리는 생성자 차용 (생성자 훔치기)(클래식 상속이라고도 함)이라는 기술을 사용하기 시작했습니다.
으아악분명히 차용 생성자는 프로토타입 체인의 두 가지 주요 문제를 단번에 해결합니다.
첫째, 프로토타입 체인에서 참조 유형 값의 독립성을 보장하며 더 이상 모든 인스턴스에서 공유되지 않습니다.
둘째, 하위 유형을 생성할 때 상위 유형에 매개변수를 전달할 수도 있습니다.
이후 생성자만 빌리면 생성자 패턴의 문제를 피할 수 없게 됩니다. 메소드는 모두 생성자에 정의되어 있으므로 함수 재사용이 불가능하며 슈퍼타입 메소드도 정의됩니다. in (예: Father)도 하위 유형에 표시되지 않습니다. 이를 고려하면 생성자 차용 기술은 단독으로 사용되는 경우가 거의 없습니다.
자세한 내용은 JS 프로토타입 체인 및 상속을 참조하세요. 마음에 드신다면 엄지손가락을 치켜세우고 지지해 주세요. 감사합니다!