javascript - Soalan ujian bertulis JS, saya tidak begitu faham, sila jelaskan
phpcn_u1582
phpcn_u1582 2017-05-19 10:40:23
0
4
504

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);

Hasilnya ialah Z, yang agak sukar untuk difahami Contoh keluaran konsol adalah seperti berikut:

phpcn_u1582
phpcn_u1582

membalas semua(4)
滿天的星座

Sebabnya sebenarnya sangat mudah, masalahnya terletak pada gelung for

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

Kunci terakhir di sini === 'z', dan hasil atribut lain mengembalikan params[key], iaitu params['z']

给我你的怀抱

Ini ialah fungsi penyalinan objek Satu-satunya perbezaan daripada objek asal ialah sifat-sifat objek yang disalin a tidak boleh dilalui menggunakan gelung for, kekunci yang dipanggil oleh fungsi get adalah semua
a = {

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

}

伊谢尔伦

Buat penutupan, atau gunakan 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);

Atau tukar kekunci var kepada kekunci biarkan

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

Di sini, Object.defineProperty(this, key, {})key di sini dibaca dan digunakan serta-merta, jadi ia adalah tingkah laku yang dijangkakanx,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)
        }
    }
Fungsi ini dilaksanakan pada titik masa pada masa hadapan, jadi apabila berjalan, ia membaca nilai key terakhir, iaitu z. Ini Ia sama dengan masalah penutupan klasik.

rrreee

Semua yang dicetak adalah 5. 🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan