JavaScript 튜토리얼: 불완전 상속(JS 프로토타입 체인)_기본 지식

WBOY
풀어 주다: 2016-05-16 17:03:59
원래의
1329명이 탐색했습니다.

Javascript 상속은 표준 oop 상속과 매우 다릅니다. Javascript 상속은 프로토타입 체인 기술을 사용합니다. 각 클래스는 프로토타입에 "멤버 변수"와 "멤버 함수"를 배치합니다. Js는 모두 링크(예: C.prototype)를 사용합니다. superclass = C.superclass = P.prototype;
var c = new C(), c.__proto__ = C.prototype;
c가 "멤버 변수"에 액세스할 때 __proto__를 얻을 수 없으면 검색합니다. C.prototype에 없으면 상위 클래스의 프로토타입에서 검색합니다. 왜냐하면 객체가 생성될 때 __proto__만 할당되고(각 객체는 독립적으로 할당됨), 다른 객체는 정의할 때 할당되기 때문입니다(각 객체에 의해 공유됨). ) 이때 C.prototype의 "멤버변수"를 객체로 접근하면 "멤버변수" 자체는 수정되지 않으나, 해당 멤버변수를 수정하게 되면 '멤버변수' 객체가 수정된다. "멤버 변수" 객체, 수정된 "멤버 변수" 객체의 멤버는 모든 객체 인스턴스에서 공유되며 이는 클래스 설계의 원래 의도에 위배됩니다.
예:

코드 복사 코드는 다음과 같습니다.

'package'.j(function() {
'class A'.j(function () {
jpublic({
v:{a: 1}
});
jprivate({
            p:{a :1}
                       );
});

'클래스 B는 A를 확장합니다'.j(function () {

});

});

var b1 = 새 B();

b1.v.a = 5;
b1.x.a = 5;

var b2 = 새 B();


console.log(b1.v.a) // 출력은 5
console.log(b1.x.a) // 출력은 5

console.log(b2.v.a) // 출력은 예상된 1이 아닌 5입니다.

console.log(b2.x.a) // 출력은 1입니다
console.log(b2.p.a ) // 사용할 수 없는 경우 p가 존재하지 않는다는 메시지가 표시됩니다.



이 문제를 어떻게 해결하나요?
A. v와 같은 멤버 "멤버 변수"(그 자체가 객체)는 프로토타입 체인에 정의되어 있지 않지만 생성자에서 호출됩니다. 이때 객체 인스턴스가 생성되면 객체의 인스턴스에 있게 됩니다. __proto__ 배포 날짜.

Js는 jprivate에 정의된 "멤버 변수" 또는 "멤버 함수"가 객체의 __proto__에 할당되고 이 인스턴스만 사용 가능한 한, jprotected에 정의된 "멤버 변수"를 제공합니다. ( (그 자체가 객체)는 객체의 __proto__에도 할당되며 이를 상속받은 객체만 사용할 수 있습니다.


B. 읽기 전용 "멤버 변수"(그 자체가 객체임)만 프로토타입 체인에 정의됩니다.

C.jpublic에서 정의한 "멤버 변수"(그 자체는 개체임)의 멤버는 읽기 전용 멤버일 뿐입니다. 값을 할당하지 않으면 다양한 인스턴스 간에 공유됩니다.

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿