문제

나는 다음과 같은 많은 코드를 본다.

function Base() {}
function Sub() {}
Sub.prototype = new Base();

그러나 그렇다면 :

s = new Sub();
print(s.constructor == Sub);

이것은 거짓입니다. S의 생성자가 실제로 하위이기 때문에 이것은 나에게 혼란스러워 보인다. 이것을하는 것이 기존/더 나은가요?

function Base() {}
function Sub() {}
Sub.prototype = new Base();
Sub.prototype.constructor = Sub;

아니면 실제로 중요하지 않습니까?

도움이 되었습니까?

해결책

'생성자'는 그렇게 보이는 방식을 수행하지 않습니다. 이것은 비표준 이외에도 인스턴스와 프로토 타입을 사용하는 것을 피해야하는 좋은 이유입니다.

기술적으로 : '생성자'는 'S'인스턴스의 속성이 아니며, 이는 '서브'프로토 타입 객체의 속성입니다. Mozilla에서 'sub'함수를 만들 때, '생성자'가 예의로 서브 함수를 가리키는 '생성자'가있는 새로 채굴 된 기본 기본 하위.

그러나 해당 프로토 타입을 새로운베이스 ()로 바꿉니다. 서브로 다시 링크가있는 원래 기본 프로토 타입은 손실됩니다. 대신, sub.prototype은 '생성자'속성을 우선적으로없는 기본 인스턴스입니다. 그래서:

new Sub().constructor===
Sub.prototype.constructor===
new Base().constructor===
Base.prototype.constructor===
Base

... 프로토 타입을 바꾸지 않은 가장 기본적인 객체까지 내려갑니다.

이것을하는 것이 기존/더 나은가요?

JavaScript 객체/클래스를 다룰 때는 어느 정도의 협약이 없습니다. 모든 라이브러리의 메타 클래스 시스템은 약간 다르게 작동합니다. 나는 각 파생 클래스에 '생성자'를 수동으로 쓴 것을 보지 못했지만 실제 생성자를 실제로 사용할 수있게하려는 것처럼 좋은 솔루션처럼 보입니다. 또한 코드를 '생성자'를 제공하지 않는 브라우저/엔진과 호환됩니다.

그러나 기존 및 다르게 행동하는 '생성자'속성과의 혼란을 피하기 위해 다른 이름을 부여하는 것을 고려할 것입니다.

다른 팁

객체가 정확히 하위 사용 인스턴스인지 테스트하려면 instanceof 운영자:-

print(s instanceof Sub);

객체가 하위 인스턴스인지 또는 하위 클래스의 인스턴스인지 알고 싶다면 isPrototypeOf 방법:-

print(Sub.prototype.isPrototypeOf(s));

응,

Sub.prototype.constructor = Sub;

인스턴스를 사용하지만 더 나은 솔루션이 있습니다. 이봐: ,Github에 대한 TDD JS 상속 , 그리고 그것을 찾으십시오 기생 조합 상속 무늬. 코드는 TDD에 이루어 지므로 매우 빨리 집어 넣을 수 있고 이름을 변경하여 시작할 수 있어야합니다. 이것은 기본적으로 Yahoo.lang.extend가 사용하는 것입니다 (출처 : Yahoo Employee 및 저자 Nicholas Zakas의 Professional JavaScript, Web Developer 's, 2nd Ed, 181 페이지). 그건 그렇고 좋은 책 (어떤 식 으로든 제휴하지 않습니다!)

왜요? 당신이 가지고있는 고전적인 패턴에는 정적 참조 Vars가 있기 때문에 (기본 객체에서 var arr = [1,2]를 만드는 경우 모든 인스턴스는 읽기/쓰기가 있으며 'ARR'의 "상태"를 공유합니다! 생성자 도둑질을 사용하십시오.이 문제를 해결할 수 있습니다. 내 예를 참조하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top