동적 원형 방식 으로 계승 체 제 를 보 여줄 수 없 는 것 에 대해 생각해 야 한다.

 
<script type="text/javascript">
function Polygon(iSides) {
this.sides = iSides;
if(typeof Polygon._initialized == "undefined") {
Polygon.prototype.getArea = function() {
return 0;
};
Polygon._initialized = true;
}
}
function Triangle(iBase,iHeight) {
Polygon.call(this,3);
this.base = iBase;
this.hei = iHeight;
if(typeof Triangle._initialized == "undefined") {
Triangle.prototype = new Polygon();
Triangle.prototype.getArea = function() {
return this.base * this.hei * 0.5;
};
Triangle._initialized = true;
}
}
var oTriangle1 = new Triangle(12,4);
alert(oTriangle1.sides);
//alert(oTriangle1.getArea());
// 。FireBug oTriangle1.getArea() function


</script>

이 코드 가 이상 하 다 고 생각 하기 시 작 했 는데 왜 실행 이 안 되 지?그래서 저 는 작가 의 서술 과 사 고 를 결합 하기 시 작 했 습 니 다.var anObject=new aFunction()형식 으로 대상 을 만 드 는 과정 은 실제로 3 단계 로 나 눌 수 있다 는 것 을 알 고 있 습 니 다.(1)새로운 대상 을 만 드 는 것(2)이 대상 에 내 장 된 prototype 대상 을 구조 함수 portotype 이 참조 하 는 그 원형 대상(3)은 이 대상 을 this 매개 변수 로 구조 함 수 를 호출 합 니 다.멤버 설정 등 초기 화 작업 을 마 쳤 습 니 다.(2)단 계 를 주의 하 십시오.원래
 
var oTriangle1 = new Triangle(12,4);
이 문장 을 실행 할 때 내부 에서 oTriangle 1.prototype=Triangle.prototype 을 실행 합 니 다.(물론,이때 Triangle.prototype 대상 자체 도 실제 속성 과 방법 이 없 었 습 니 다.그 다음 에 제(3)단계 까지 함수 체 를 실행 하고 처음으로
 
Triangle.prototype = new Polygon();
까지 실 행 했 습 니 다.그러나 이 문장 이 실 행 된 후에 oTriangle 1.prototype 은 더 이상 값 을 부여 할 수 없습니다.(즉,oTriangle 1.prototype=Triangle.prototype 을 실행 할 수 없습니다.)다음 프로그램 실행
 
Triangle.prototype.getArea = function() {
return this.base * this.hei * 0.5;
};
은 이미 늦 었 습 니 다.o Triangle 1.prototype 대상 은 이 방법 을 가지 고 있 지 않 습 니 다.이 방법 을 가 진 사람 은 방금 new Polygon()이 만 든 대상 일 수 밖 에 없어 서 프로그램의 마지막 줄 주석 결과 가 나 왔 습 니 다.하지만 그 다음 에 만 든 트라이앵글 대상 은 정상적으로 작 동 할 수 있 습 니 다.다음 코드 를 보십시오.코드
 
<script type="text/javascript">
function Polygon(iSides) {
this.sides = iSides;
if(typeof Polygon._initialized == "undefined") {
Polygon.prototype.getArea = function() {
return 0;
};
Polygon._initialized = true;
}
}
function Triangle(iBase,iHeight) {
Polygon.call(this,3);
this.base = iBase;
this.hei = iHeight;
if(typeof Triangle._initialized == "undefined") {
Triangle.prototype = new Polygon();
Triangle.prototype.getArea = function() {
return this.base * this.hei * 0.5;
};
Triangle._initialized = true;
}
}
var oTriangle1 = new Triangle(12,4);
alert(oTriangle1.sides);
//alert(oTriangle1.getArea());
// 。FireBug oTriangle1.getArea() function
var oTriangle2 = new Triangle(10,5);
alert(oTriangle2.sides);
// 。
alert(oTriangle2.getArea());
</script>
가 원인 에 대해 서 말하자면 제 가 앞에서 분석 한 것 입 니 다.이때 내부 에서 oTriangle 2.prototype=Triangle.prototype 을 실행 합 니 다.이 원형 대상 은 실제 속성 과 방법 이 있 는 대상 에 게 인용 되 었 다.

좋은 웹페이지 즐겨찾기