2010-03-12 10 views
1
var author = { 
firstname: 'Martin', 
lastname: 'Hansen' 
} 

function settersGetters(propStr) { 
for (var i = 0; i < propStr.length; i++) { 

    author['_'+ propStr[i]] = null; 

    author.__defineGetter__(propStr[i], 
    function() { 
     return author['_'+ propStr[i]]; 
    }); 

    author.__defineSetter__(propStr[i], 
    function(val) { 
     author['_'+ propStr[i]] = val; 
    }); 
}; 
} 

Le code ci-dessus générerait, espérons-le, des setters/getters pour toutes les propriétés fournies (dans un tableau) pour l'auteur de l'objet.Javascript setters/getters

Mais quand j'appelle le code ci-dessous Le prénom et le nom est olsen .. Qu'est-ce que je fais mal?

settersGetters(['firstname', 'lastname']); 
author.firstname = 'per'; 
author.lastname = 'olsen'; 

console.log(author.firstname); 
console.log(author.lastname); 

Répondre

1

La définition est faite dans une fermeture, donc tous les setters utilisent la dernière valeur de i.

Utilisez ce lieu:

function setterGetter(property) 
{ 
    author['_'+ property] = null; 

    author.__defineGetter__(property, 
    function() { 
     return author['_'+ property]; 
    }); 

    author.__defineSetter__(property, 
    function(val) { 
     author['_'+ property] = val; 
    }); 
} 
function settersGetters(propStr) { 
for (var i = 0; i < propStr.length; i++) { 
     setterGetter(propStr[i]); 
}; 
} 
+0

Merci, résolu. –

2

Je soupçonne que c'est un problème de fermeture, laquelle plusieurs personnes utiles m'a expliqué here.

Essayez d'envelopper la référence i dans une fonction et lisez les fermetures. Malgré toute l'aide, j'avoue que je ne les comprends pas vraiment.

+1

Il est en effet, lorsque les fonctions générées sont appelés, ils vont toujours avoir la plus haute valeur 'I'. Plus: http://blog.niftysnippets.org/2008/02/closures-are-not-complicated.html –