2013-05-09 62 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方法,該方法對您來說就像更正式的深度克隆方法一樣。