2017-04-06 83 views
0

在此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; 

是否返回经由Object.assign在setNewsletterHttpRequest该模块保持分离该对象,以便每个请求创建其自己的实例的透视图对象(每个具有经由http请求req.body.users设置其自己的用户的值[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???!!!! 

所以,是的,得到的对象是不同的对象,但要小心,因为它是一个浅拷贝!

+0

谢谢。所以我只在用户对象上使用原语,这应该没问题。但是,如果一个对象被用作属性,那么可能会有问题,如您的示例所示。这导致了另一个问题,因为从setNewsletterHttpRequest返回的每个对象都是通过一个Express路由的http请求生成的,所以不应该将每个请求隔离 - 这意味着只有一个var p = perspectives.setNewsletterHttpRequest(req)在任何给定的时间(每个都有自己的属性通过请求主体设置)? –

+0

是的,每个'req'将是唯一的AFAIK。 – Trott