对象分配和对象实例

时间:2017-04-06 16:10:13

标签: node.js

在这条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]行设置)?我正在尝试确保不同的请求修改同一个对象,但每个请求都在修改自己实例的状态。谢谢。

1 个答案:

答案 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???!!!!

所以,是的,生成的对象是不同的对象,但要小心,因为它是一个浅的副本!