2012-04-27 28 views
5

Per favore aiutami a capire questo pezzo di codice.ereditarietà di oggetti Javascript

var person = { 
    'first-name': 'FirstName', 
    'last-name': 'LastName', 
    'gender': 'Male' 
}; 

var anotherPerson = new Object(person); 
anotherPerson.desig = 'Designation'; 

console.log('Another person designation: ' + anotherPerson['desig'] + ', person designation: ' + person['desig']); 

mi aspettavo l'uscita di essere Another person designation: Designation, person designation: undefined ma con mia sorpresa ho trovato che fosse `Another person designation: Designation, person designation: Designation.

Secondo me anotherPerson sta estendendo person oggetto e le proprietà impostata anotherPerson non dovrebbero essere visibili person oggetto. Ho sbagliato qui? O è che entrambi gli oggetti puntano alla stessa posizione?

[EDIT]

Ora ci sono ancora più sorprese.

Ho aggiunto il seguente codice a quanto sopra.

person.place = 'XYZ'; 
console.log(person['place'] + ', ' + anotherPerson['place']); // Expected: XYZ, undefined. Result: XYZ, XYZ. 

Sulla base dei risultati e delle risposte di cui sopra ho pensato che entrambi gli oggetti si riferiscono alla stessa posizione. Ora ho aggiunto poche altre righe

person = undefined; 
console.log(anotherPerson['place']) //Expected: error, Result: XYZ. ??!?!? 
console.log(person['place']) // Expected: error, Result: error. 

Qualcuno può farmi un po 'di luce per capirlo? Grazie per il vostro aiuto in anticipo

+0

Non c'è eredità qui. Solo due riferimenti allo stesso oggetto. – Cameron

+0

Quindi come si può clonare l'oggetto e crearne uno nuovo? Io, come l'OP probabilmente, ho pensato che il nuovo avrebbe creato un NUOVO oggetto. – DanRedux

+0

Vedere: http://stackoverflow.com/questions/728360/copying-an-object-in-javascript –

risposta

2

Non si sta eseguendo un'estensione o alcun tipo di eredità.

Questo si avvicina:

var Person = function() { 
    this["first-name"] = 'FirstName', 
    this["last-name"] = 'LastName', 
    this["gender"] = 'Male' 
}; 

var person = new Person(); 
var anotherPerson = new Person(); 

Ora avete due separate istanze di Person. Se anche voi volete anotherPerson essere una sottoclasse ..

var Person = function() { 
    this["first-name"] = 'FirstName', 
    this["last-name"] = 'LastName', 
    this["gender"] = 'Male' 
}; 

var AnotherPerson = function() { 
    this.desig = "Designation"; 
} 
AnotherPerson.prototype = new Person(); // inherit from Person 
AnotherPerson.prototype.constructor = AnotherPerson; // reset constructor 

var person = new Person(); 
var anotherPerson = new AnotherPerson(); 

console.log(person.desig); // undefined 
console.log(anotherPerson.desig); // Designation 
+1

Avevo appena finito di scrivere lo stesso primo blocco di codice;) +1 – bhamlin

+0

@Frits Grazie per la risposta. Ricevo il codice che hai spiegato. Quindi quando facciamo 'new Object (person)' è che 'anotherPerson' si riferisce alla stessa posizione? Ho provato ad aggiungere una nuova proprietà a 'person' e' anotherPerson' è stata in grado di leggere con successo la nuova proprietà. Perché è così? – Anji

+0

Non sono del tutto sicuro di cosa faccia 'nuovo oggetto (persona) ... forse si risolve in' persona'? So che non si estende magicamente da 'person': P – Halcyon

0
Non

davvero una soluzione, ma per me, questo è come mi clonare un oggetto in modo tale che posso estenderlo:

var anotherPerson = new Object(); 
for(i in person) anotherPerson[i]=person[i]; 

Invece di

var anotherPerson = new Object(person); 

Quindi funziona come previsto.

+0

Posso sapere cosa succede esattamente quando facciamo 'var anotherPerson = new Object (person)'? – Anji

0

La funzione Object (nota: lo stesso, ancora più sorprendente se non hai familiarità con quello che sta succedendo, si applica a chiamare new Object(...)) non crea un nuovo oggetto se è passato qualcosa che non è di tipo booleano, numerico o stringa; restituisce solo l'oggetto già esistente. (Motivazione:., Perché è già un oggetto Quasi tutto è un oggetto in Javascript.)

Pertanto, anotherPerson è esattamente lo stesso oggetto come person, in modo che quando si modifica lo si modifica person troppo.

Non sostengo che si tratti di un comportamento ragionevole; ma è ciò che definisce la lingua specifica.

0

Se si desidera estendere/ereditare un oggetto allora si può fare

var person = { 
    'first-name': 'FirstName', 
    'last-name': 'LastName', 
    'gender': 'Male' 
}; 
if (typeof Object.create !== 'function') 
{ 
    Object.create=function(o) 
    { 
     function F(){} 
     F.prototype=o; 
     return new F(); 
    } 
} 
var newPerson=Object.create(person); 
newPerson.age=25; 
newPerson.gender="Female"; 

console.log(person.gender); // Male 
console.log(newPerson.gender); // Female 

console.log(person.age); // undefined 
console.log(newPerson.age); // 25 

Fiddle

Riferimento:Prototypal Inheritance in JavaScript

+0

Il modo di Douglas Crockford! Perfezionare. – Anji

+0

Sì, è vero. –

0

una soluzione generale per l'attuazione di successione in JavaScript

function inherits(base, extension) 
{ 
    for (var property in base) 
    { 
     try 
     { 
     extension[property] = base[property]; 
     } 
     catch(warning){} 
    } 
} 
+0

Perché in una prova/cattura? – alex

Problemi correlati