2015-07-24 17 views
5

Ho letto dei diversi modi di eseguire OOP in JS.Comprensione dell'implementazione OOP in classe di Crockford

Dave Crockford ha un approccio interessante in cui non sembra affatto utilizzare la delega. Invece, a me sembra che utilizzi puramente la concatenazione degli oggetti come meccanismo ereditario, ma è piuttosto difficile per me dire cosa sta succedendo e spero che qualcuno possa aiutare.

Ecco un esempio che crockford dà in uno dei suoi discorsi.

function constructor(spec) { 
    let {member} = spec, 
     {other} = other_constructor(spec), 
     method = function() { 
     // accesses member, other, method, spec 
     }; 

    return Object.freeze({ 
     method, 
     other 
    }); 
} 

E qui è un esempio da a gist

function dog(spec) { 

    var { name, breed } = spec, 
     { say } = talker({ name }), 
     bark = function() { 

     if (breed === 'chiuaua') { 
      say('Yiff!'); 
     } else if (breed === 'labrador') { 
      say('Rwoooooffff!'); 
     } 

     }; 

    return Object.freeze({ 
    bark, 
    breed 
    }); 

} 

function talker(spec) { 

    var { name } = spec; 
    var say = function(sound) { 
     console.log(name, "said:", sound) 
     } 

    return Object.freeze({ 
    say 
    }); 

} 

var buttercup = dog({ name: 'Buttercup', breed: 'chiuaua' }); 

Sono confuso di un paio di cose.

Non ho mai visto i letterali oggetto utilizzati in questo modo prima.

  • Non specifica coppie chiave-valore e invece solo la virgola separa le stringhe.
  • li utilizza sulla mano sinistra di un'assegnazione

Inoltre, quali sono i vantaggi offerti dal congelamento l'oggetto torna?

risposta

6

Dove non specifica le coppie chiave-valore e invece solo la virgola separa le stringhe che sta sfruttando uno ES6 feature that converts the variable names of the values into string object keys for you.

{ bark, breed } 

è l'equivalente di:

{ bark: bark, breed: breed } 

Il vantaggio di congelamento un oggetto è immutabilità. Una volta che un oggetto è congelato, le sue proprietà non possono essere modificate.

Questo è un bene, perché aiuta a evitare alcuni errori comuni, come cercare di modificare una proprietà inesistente errori di scrittura, e voi (e altri codificatori) si ferma ridefinire o l'aggiunta di metodi e proprietà per l'oggetto dopo che è stato creato.

MODIFICA: Un'altra funzionalità ES6 qui illustrata è destructuring.

var { name, breed } = spec; 

è l'equivalente di:

var name = spec.name, 
    breed = spec.breed;