2010-08-16 3 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 

Pourquoi les instances partagent-elles le champ a?Champ JavaScript Héritage comportement étrange

Répondre

2

Cela se produit car l'objet a est partagé sur toutes les instances de B (puisque le prototype B est une instance de A).

Une solution serait d'attribuer un nouvel objet dans votre méthode Test comme propriété que ombres celui qui est disponible sur la chaîne de prototype, par exemple:

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

> Cela se produit parce que l'un l'objet est partagé entre toutes les instances de B. Mais pourquoi cela fonctionne-t-il avec b field? Pourquoi l'objet est partagé mais les types simples non? – dotneter

+0

@dotneter: 'a' est un objet, en faisant:' this.ax = valeur; 'vous modifiez l'objet hérité, partagé par toutes les instances, en assignant' this.b = valeur; 'vous créez une propriété dans l'objet courant ('this'), en ombrant l'héritage, tout comme dans mon exemple je fais' this.a = {x: valeur}; ', une nouvelle propriété est créée sur l'objet que' this' pointe vers. – CMS