有没有一种很好的方法来冻结Javascript中的对象数组?

时间:2016-08-18 21:09:38

标签: javascript

所以我有一个类似于以下内容的Javascript模块:

const data = [
     {
          id: 'do not modify',
          name: 'do not modify'
     },         
     {
          id: 'do not modify 2',
          name: 'do not modify 2'
     }
];

export default data;

有没有一种干净的方法我可以递归冻结数组中的所有对象而不在每个对象上显式调用Object.freeze()?我意识到我可以在导出之前循环遍历数组并冻结它们,但我很想知道是否有更优雅的解决方案。

4 个答案:

答案 0 :(得分:5)

您只需将Object.freeze传递给Array.prototype.forEach

'use strict';
var objs = [
  { a: 1 },
  { b: 2 },
  { c: 3 }
];

objs.forEach(Object.freeze);
objs[0].a = 4; // Fails due to being frozen

答案 1 :(得分:0)

如果不在每个对象上调用freeze,则无法使用内部元素冻结数组。您可以在此处找到y(k) = log(L(k)/u)冻结https://developer.mozilla.org/pl/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

的示例

我正在粘贴上面链接的页面中的代码:

deep

答案 2 :(得分:-1)

data.forEach(Object.freeze)是您能做的最好的事情。

在您的情况下,您可以像这样清理代码:

const data = [
  unmodifiableObj(0, 'Foo'),
  unmodifiableObj(1, 'Bar')
]

export default data;


function unmodifiableObj(id, name) {
  return Object.freeze({ id, name })
}

答案 3 :(得分:-1)

更新了MDN

的示例代码

试试这个:

// To make obj fully immutable, freeze each object in obj.
// To do so, we use this function.
function deepFreeze(obj) {

// Retrieve the property names defined on obj
var propNames = Object.getOwnPropertyNames(obj);

// Freeze properties before freezing self
propNames.forEach(function(name) {
var prop = obj[name];

// Freeze prop if it is an object
if (typeof prop == 'object' && prop !== null)
  deepFreeze(prop);
});

// Freeze self (no-op if already frozen)
return Object.freeze(obj);
}

将冻结数组本身及其包含的任何对象。