2010-08-16 4 views
2
function A(){ 
    this.a = {}; 
    this.b = 0; 
    this.Test = function(value){ 
     this.a.x = value; 
     this.b = value; 
    }; 
} 

function B(){} 
B.prototype = new A; 


    var b1= (new B()); 
    b1.Test(1); 
    var b2= (new B()); 
    b2.Test(2); 
    log(b1.b == 1); //true 
    log(b2.b == 2); //true 
    log(b1.a.x == 1);//false x == 2 
    log(b2.a.x == 2);//true 

인스턴스가 필드를 공유하는 이유는 무엇입니까?JavaScript 필드 상속 된 이상한 동작

답변

2

B (B 프로토 타입의 인스턴스가 A이므로) 모든 인스턴스에서 a 개체가 공유되기 때문에 이런 현상이 발생합니다.

해결 방법은 자신의 재산으로 당신의 Test 방법에그 그림자을 새로운 객체를 할당하는 것, 프로토 타입 체인에 사용할 수 예를 들어 하나 :

function A(){ 
    this.a = {}; 
    this.b = 0; 
    this.Test = function(value){ 
    this.a = {x: value}; // shadow the object on the prototype chain 
    this.b = value; 
    }; 
} 

function B(){} 
B.prototype = new A; 


var b1= new B(); 
b1.Test(1); 

var b2= new B(); 
b2.Test(2); 

console.log(b1.b == 1); //true 
console.log(b2.b == 2); //true 
console.log(b1.a.x == 1);//true 
console.log(b2.a.x == 2);//true 
+0

>이이 (가) 때문에 발생 개체가 B의 모든 인스턴스에서 공유됩니다. 그러나 b 필드와 함께 작동하는 이유는 무엇입니까? 왜 객체는 공유되었지만 간단한 유형이 아닌가? – dotneter

+0

@dotneter :'a'는 객체입니다 :'this.ax = value;'당신은 자신의 속성을 만들고있는'this.b = value; '를 지정하여 모든 인스턴스가 공유하는 상속 된 객체를 수정합니다 현재의 객체 ('this')에서 상속 된 객체를 숨기고, 나의 예제에서와 같이'this.a = {x : value};'를 실행하면'this'가 가리키는 객체에 새로운 속성이 생성됩니다. – CMS