Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过闭包复制对象_Javascript - Fatal编程技术网

Javascript 通过闭包复制对象

Javascript 通过闭包复制对象,javascript,Javascript,我试图得到一个像这样的对象的副本: graphs = (function () { var trends = { pointSize: 10, }; // Object Oriented JavaScript - pp 109 var lockVariable = function(x) { return function() { return x; } }; var ge

我试图得到一个像这样的对象的副本:

graphs = (function () {
    var trends = {
        pointSize: 10,
    };

    // Object Oriented JavaScript - pp 109
    var lockVariable = function(x) {
        return function() {
            return x;
        }
    };

    var getTrendsConfig = function() {
        return lockVariable(trends)();
    };
    return {
        getTrendsConfig : getTrendsConfig
    };
}());

c = graphs.getTrendsConfig();
c.pointSize = 11;
console.log(graphs.getTrendsConfig())
我本来想打印一个“{pointSize:10}”

因为getTrendsConfig函数将趋势对象传递给lockVariable函数,该函数将返回本地值对象:“{pointSize:10}”,而我得到的是“{pointSize:11}”

我从《面向对象的JavaScript》一书第108-109页的一个例子中得出:

我如何获得预期的结果?可能吗?为什么这不起作用?

graphs=(函数(){
风险值趋势={
点数:10,
};
//面向对象JavaScript-pp 109
变量=函数(x){
返回函数(){
返回x;
}
};
var getTrendsConfig=函数(){
回报率(趋势)();
};
返回{
getTrendsConfig:getTrendsConfig
};
}());
c=Object.assign({},graphs.getTrendsConfig());//与ES6扩展语法中的…graphs.getRendsConfig()相同
c、 点大小=11;
log(graphs.getTrendsConfig());

console.log(“c=”,c)JavaScript中的基本值(如数字)是不可变的。您可以将
i
复制到
x
(根据本书),更改
i
并保持
x
不变

对象不是不变的,只能通过引用来寻址。当返回
trends
c=graphs.getTrendsConfig();
)的值时,返回的是对对象的引用(因此
c
trends
都包含对同一对象的引用)。修改该对象时,即修改该对象。获取另一份
trends
将为您提供另一份引用副本…它仍然指向同一对象

处理这个问题的简单方法是将创建对象的逻辑移动到被调用的函数中

graphs=(函数(){
变量=函数(x){
返回函数(){
返回x;
}
};
var getTrendsConfig=函数(){
风险值趋势={
点数:10,
};
回报率(趋势)();
};
返回{
getTrendsConfig:getTrendsConfig
};
}());
c=graphs.getTrendsConfig();
c、 点大小=11;

console.log(graphs.getrendsconfig())
谢谢,您的答案缺少我能够将pointSize重新指定为11的核心原因。不过有一个问题,为什么要将对象移动到被调用的函数中,使代码工作?@mclzc–调用函数时,您创建了对象。你不能重复使用同一个。