2013-05-09 67 views
-1

我有这样的构造:我需要在这个地方关闭吗?

var EditableItem = (function() { 

    function EditableItem(schema, item) { 
     this.schema = _.clone(schema); 
     this.item = _.clone(item); 
     this.propertyTypes = [ 
      'stringProperties', 
      'booleanProperties']; 
    } 

    EditableItem.prototype = { 
     createItem: function() { 
      var self = this; 
      self.propertyTypes.forEach(function(type) { 
       var properties = self.schema[type]; 
       properties.forEach(function(property, i) { 
        var itemProperty = self.item[type][property.id]; 
        if (itemProperty) { 
         properties[i].value = itemProperty; 
        } 
       }); 
      }); 

      self.schema.itemId = self.item._id; 

      return self.schema; 
     } 
    }; 

    return EditableItem; 

})(); 

,每次我用它,这样的时刻......

async.parallel({ 
    schema: function(callback) { 
     schemas().findOne({ 
      _id: 'default' 
     }, callback); 
    }, 
    items: function(callback) { 
     items().find().toArray(callback); 
    } 
}, 

function(err, result) { 
    if (err) return callback(err); 

    var all = result.items.map(function(item) { 
     return new EditableItem(result.schema, item).createItem(); 
    }); 

    callback(null, all); 
}); 

...我结束了一个数组result其中最后一个项目反复而其他的被省略。

我的猜测是我需要在某处添加一个闭包,正如你所看到的我已经尝试过,但它仍然会产生相同的结果。有任何想法吗?

编辑:我找到了解决方案。这不是很好,但也许这里有人可以解释它为什么可以工作并提供更好的解决方案...

在构造函数中,我有: this.schema = _.clone(schema);

我改为: this.schema = JSON.parse(JSON.stringify(schema));

这似乎为对象分配新的内存,而_.clone仍然保留对原始对象的一些引用(我猜)。

+1

普通对象没有'.map()'方法。即便如此,你没有理由在你的'.map()'回调函数里有另一个函数。你已经有了一个唯一的变量作用域。 – 2013-05-09 18:23:53

+0

也许是因为你在内部结束时有一个额外的')'? - '})(schema,item));' – Ian 2013-05-09 18:24:30

+0

'var EditableItem =(...)();' ... – Nenad 2013-05-09 18:27:10

回答

0

的Javascript数字,字符串&布尔值是等同和由值传递而对象和阵列等同,并通过引用传递。由于对象的JSON表示是一个字符串,因此它将被等同并按值传递。

如果使用JSON表示schema给出与克隆(对象)不同的行为,那么我们可以得出结论:该克隆仍然包含对原始未克隆的相同对象的引用schema;即。克隆不是“深”的。

据我所知,underscore.js还没有提供深层克隆,但Lo_Dash呢。您可能想尝试Lo_Dash的下划线兼容性构建。

或者,只需坚持使用您的JSON方法,该方法对您来说就像更正式的深度克隆方法一样。