javascript - 当我 `jQuery.extend` 两个具有相同缓存对象的对象时,为什么我有共享缓存?

标签 javascript jquery

我可以用这个简单的代码片段最好地解释这个问题:

    var child1 = {name: 'child1'};
    var child2 = {name: 'child2'};

    var parent = {
        _cache: [],  // storage var
        writeCache: function(key, val)
        {
            console.log('writing cache::'+this.name);
            this._cache[key] = val;
        },
        readCache: function(key)
        {
            if(this._cache[key] == undefined)
            {
                return false;
            }
            return this._cache[key];
        },
    };
    jQuery.extend(child1, parent);
    jQuery.extend(child2, parent);

    child1.writeCache('myKey', 123);

    console.log(child1.readCache('myKey'));  // returns 123 as expected

    console.log(child2.readCache('myKey'));  // returns 123 unexpectedly (for me at least)

请参阅最后一行:

    console.log(child2.readCache('myKey'));

现在,当我们只访问了 child1 的 writeCache() 时,为什么它会返回 123?

最佳答案

jQuery 的扩展方法复制第二个对象中的所有内容并将其放入第一个对象中。

这包括将引用复制到您分配给parent._cache的数组。因此,每当您从任何对象缓存中读取或写入时,您都会访问相同的数据存储。

为避免这种情况,请进行深层复制。

jQuery.extend(true, child1, parent);
jQuery.extend(true, child2, parent);

顺便说一句,由于您正在处理命名键,因此请使用对象,而不是数组。

_cache: {},  // storage var

关于javascript - 当我 `jQuery.extend` 两个具有相同缓存对象的对象时,为什么我有共享缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7702232/

相关文章:

javascript - 简单打字游戏 (JavaScript)

javascript - 在 Angular 中缩短 Linky

javascript - 为 svg 路径元素提供数字

javascript - 如何使用 Uglify2 cli 修改顶级变量名称

jquery-ui - JQuery 自动完成而不使用标签、值、id

javascript - 如何在 Mojolicious perl 中正确加载 Javascript 文件?

jquery - 单击 anchor 标记时将其链接复制到剪贴板

php - 基于网络的 PDF 文档编辑器

jquery - HTML 文件属性问题

javascript - 使用jquery使一行中的列高度相等