2012-12-05 14 views
13

cosa è la differenza traeredità JavaScript con _.extend()

Employee.prototype = Object.create(Person.prototype); 

e

_.extend(Employee.prototype, Person.prototype); 

Entrambi dare risultati simili (output), ma il metodo di sottolineatura sembra aggiungere il Person.prototype a il Employee.constructor.prototype, e piuttosto abit roba extra qua e là, perché?

pura JS

enter image description here

underscoreJS

enter image description here

Un bel effetto collaterale di _.extend è che posso facilmente fare l'ereditarietà multipla: sembra come si pretende molto fare la catena di prototipi più a lungo troppo. ..

_.extend(Employee.prototype, Person.prototype); 
_.extend(Employee.prototype, { 
    doSomething: function() { 
     return "hi ..."; 
    } 
}); 

Ma ...

enter image description here

Perché c'è 2 funzioni SayHi e DoSomething? (in realtà è lo stesso quando faccio solo 1 estensione).

http://jsfiddle.net/VMqSy/1/

risposta

17

Con Employee.prototype = Object.create(Person.prototype); si è completamente sostituendo il Employee.prototype.

Ma con _.extend(Employee.prototype, Person.prototype); si aggiunge Person.prototype in cima allo Employee.prototype.

Per esempio,

var a = {var1:1, var2:2}; 
var b = {var2:4, var3:3}; 
console.log(_.extend(a, b)); // {var1:1, var2:4, var3:3} 

Come si vede, a non è completamente sostituito da b, è solo esteso dalle proprietà definite nella b.

+0

Un'altra differenza è '_.extend' sembra estendere' constructor.prototype' (non '.extend')? Sono gli stessi"? Oltre a loro in posti diversi? –

+0

'_.extend' modifica il primo oggetto passato, quindi, nel mio esempio,' b' rimane invariato, ma 'a' è effettivamente esteso da' b'. In '_.extend ({}, a, b)', 'a' e' b' rimangono invariati, e '{}' è esteso per le loro proprietà. – rdiazv

+0

Nota che se lo fai in questo modo, cioè '_.extend (Employee.prototype, Person.prototype);', ogni istanza creata con 'new' ti restituirà un' Employee', e quel Dipendente non sarà un 'Persona', cioè' new Employee() instanceof Person' dovrebbe essere 'false'. – user3743222