2011-03-23 5 views
0
<script> 
function ClassA() 
{ 
    this.a=function(){alert();}; 
} 
function ClassB() 
{ 
    this.b=function(){alert();}; 
} 
ClassB.prototype=new ClassA(); 
var objB1=new ClassB(); 
var objB2=new ClassB(); 
alert(objB1.a==objB2.a); 
alert(objB1.b==objB2.b); 
</script> 

첫 번째 경고가 true이고 두 번째 경고가 false 인 이유는 무엇입니까? Thanks자바 스크립트의 프로토 타입에 대한 질문입니다.

답변

2

특성 "a"는 ClassB의 인스턴스의 직접 속성이 아니기 때문에 (즉, objB1.hasOwnProperty ("a")가 false 임) 해당 프로토 타입에서 속성을 읽습니다. ClassB의 모든 인스턴스에 대해 하나의 프로토 타입 객체가 있기 때문에 objB1.a 및 objB2.a는 말 그대로 자신의 공통 프로토 타입 객체에 정의 된 동일한 함수를 참조합니다. (objB1.a===objB2.a을 확인할 수 있습니다).

그러나 속성 "b"는 ClassB의 모든 인스턴스마다 새 함수로 정의되며 별도의 함수 인스턴스는 서로 동일하지 않습니다.

+0

고맙습니다. 당신의 대답은 훌륭합니다. – jsnewman

0

Upvoted @ maerics (좋은) 대답이지만 명백하지 않은 것을 지적하고 싶습니다. (생성자) 함수 안에서 this은 새로 생성되는 인스턴스를 나타냅니다. 따라서 new ClassA 또는 new ClassB이 호출 될 때마다 새 인스턴스가 만들어지고 this.a 또는 this.b은 새로 인스턴스화 된 개체의 속성에 할당 된 새 함수를 참조합니다.

코드를 살펴보면 간단하게 "각 유형의 새 인스턴스를 몇 개 만들었습니까?"라고 묻는 간단한 질문이 있습니다.

는 그냥 ClassA의 인스턴스가 생성되는 한, 따라서, 하나의 기능 this.a 할당 수단 new ClassA() 중 하나만 발생을 참조. 그러나 발생을 new ClassB(), 따라서 두 개의 새 함수가 각 인스턴스에 대해 하나씩 만들어집니다.

+0

도움 주셔서 감사합니다. – jsnewman

관련 문제