2017-03-10 3 views
2
var nextid = 0 
function Animal(name) { 
    this.name = name 
    Object.defineProperty(this, 'nextid', 
    {value: nextid++, writable: false}) 
} 
var animal1 = new Animal('dog') 
var animal2 = new Animal('cat') 

Je me demande si c'est un bon moyen par rapport à l'utilisation d'une fermeture ou d'un modèle d'usine?Incrémenter l'objet id

Ma question est similaire à ce fil (fermeture et modèle d'usine suggéré):

Incrementing object id automatically JS constructor (static method and variable)

Répondre

1

Ces fermetures et modèles d'usine dans la seule existe réponse liée à encapsuler la variable nextid dans une portée locale ou une usine exemple. La manière dont vous créez l'animal - en tant qu'objet simple, instance de classe ou instance avec une propriété en lecture seule - n'a rien à voir avec cela. Chacun d'eux est également bon. Que vous ayez réellement besoin de l'encapsulation dépend de votre approche de modularisation (par exemple, la fermeture est inutile dans un module de nœud) et des exigences d'unicité pour les identifiants.

1

Ids ne doit pas être généré dans le cadre de la construction d'un objet: ils devraient être affectés à l'objet. Pensez à une course athlétique: les coureurs choisissent-ils leur dorsale?

function Animal() { 

} 

var idGenerator = new IdGenerator(); 
var animal = new Animal(); 
animal.id = idGenerator.generate(); 

Probablement vous pourriez encore être en mesure de générer ids dans un constructeur, mais je voudrais essayer d'éviter de coder en dur génération identifiant injection d'un idGenerator à la place:

function Animal(idGenerator) { 
    this.id = idGenerator.generate(); 
} 

BTW mes deux cents est que vous devriez aller avec la première approche: les coureurs n'assignent pas dorsals eux-mêmes.