在这条Express路线中,我导入了这个透视模块。
//routes/api.js
var perspectives = require('../controllers/perspectives');
router.route('/perspectives/newsletter')
.post(function(req, res){
var p = perspectives.setNewsletterHttpRequest(req);
p.updateNewsletter();
});
setNewsletterHttpRequest(req)方法获取请求对象,然后返回透视模块本身的副本(Object.assign)。
//controllers/perspectives.js
perspectives.setNewsletterHttpRequest = function(req, updateMarketoOnly) {
let user = req.body.users[0];
this.validBpNewsletterUpdateInput = true;
this.user = user;
return Object.assign({},this);
}
module.exports = perspectives;
通过setNewsletterHttpRequest中的Object.assign返回此模块会使对象保持隔离状态,以便每个请求都创建自己的透视对象实例(每个对象都有自己的用户值,通过http请求req.body.users [0]行设置)?我正在尝试确保不同的请求修改同一个对象,但每个请求都在修改自己实例的状态。谢谢。
答案 0 :(得分:0)
Object.assign()
从源对象复制到目标对象,因此每个对象将与您的案例中的所有其他对象分开。无论其....
如果任何属性值是对象(包括例如数组),则它们将通过引用复制。 (这可能在技术上不正确,但它是这种情况的适当简写。)Sooooo:
var source = {num:0, str:'', arr:[], obj:{}};
var a = Object.assign({}, source);
var b = Object.assign({}, source);
console.log(a === b); //false
console.log(a == b); //false
// Let's modify `b` and see what happens.
b.added = 'I added this';
console.log(a.added); //undefined, cool
b.num = 4;
console.log(a.num); //0, cool
b.arr.push('new value');
console.log(a.arr) //['new value'], wha??!!!
b.obj.newValue = 'new value';
console.log(a.obj) //{newValue: 'new value'}, also wha???!!!!
所以,是的,生成的对象是不同的对象,但要小心,因为它是一个浅的副本!