recherche

Maison  >  Questions et réponses  >  le corps du texte

javascript - Une question de test écrit JS, je ne la comprends pas très bien, veuillez expliquer


function A(params) {
    params = params || {};
    for(var key in params){

        Object.defineProperty(this, key, {
            get : function() {
                return params[key]
            },
            enumerable : false
        });
    }
}


var a = new A({
    'x' : 'X',
    'y' : 'Y',
    'z' : 'Z'
})

console.log(a.x);

Le résultat est Z, ce qui est un peu difficile à comprendre. L'exemple de sortie de la console est le suivant :

phpcn_u1582phpcn_u15822792 Il y a quelques jours489

répondre à tous(4)je répondrai

  • 滿天的星座

    滿天的星座2017-05-19 10:42:23

    La raison est en fait très simple, le problème réside dans la boucle for

    for(var key in params){
        Object.defineProperty(this, key, {
            get : function() {
                return params[key]
            },
            enumerable : false
        });
    }

    La clé finale ici === 'z', et les résultats des autres attributs renvoient params[key], c'est-à-dire params['z']

    répondre
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-19 10:42:23

    Il s'agit d'une fonction de copie d'objet. La seule différence par rapport à l'objet original est que les attributs de l'objet copié a ne peuvent pas être parcourus à l'aide d'une boucle for. En raison de la fermeture, les clés appelées par la fonction get sont toutes z. = {

    'x' : 'X',
    'y' : 'Y',
    'z' : 'Z'

    }

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-19 10:42:23

    Créez une fermeture ou utilisez let

    function A(params) {
        params = params || {};
        for(var key in params){
        
            (function(key){
                Object.defineProperty(this, key, {
                    get : function() {
                        return params[key]
                    },
                    enumerable : false
                });
            }).call(this,key);
        }
    }
    
    
    var a = new A({
        'x' : 'X',
        'y' : 'Y',
        'z' : 'Z'
    })
    
    console.log(a.x);
    

    Ou changez la clé var en clé let

    répondre
    0
  • 阿神

    阿神2017-05-19 10:42:23

    Object.defineProperty(this, key, {
        get : function() {
            return params[key]
        },
        enumerable : false
    });

    Ici, Object.defineProperty(this, key, {})La key ici est lue et utilisée immédiatement, c'est donc le comportement attendux,y, zObject.defineProperty(this, key, {})这里的key是立即读取使用的,所以是预期行为x,y,z

        get : function() {
            return params[key]
        }

    这个函数是未来的一个时间点执行的,所以运行的时候读取的是最后的key值,即z

        for(var i=0; i<5; i++) {
            dom[i].onclick = function() { // dom为一个dom数组
                console.log(i)
            }
        }

    Cette fonction est exécutée à un moment dans le futur, donc lors de son exécution, elle lit la dernière valeur clé, qui est z. C'est la même chose que le problème de fermeture classique.

    rrreee

    Tout ce qui est imprimé est 5. 🎜

    répondre
    0
  • Annulerrépondre