javascript - Object.freeze 函数有什么理由吗?

标签 javascript immutability

我理解递归深层对象以对其每个子属性执行浅层 Object.freeze 的意义。卡住函数对象的值有什么意义?由于较高级别的浅卡住,引用已被卡住——是否可以改变函数对象的值本身?

例子:

// Library Function [deepFreeze source](https://github.com/substack/deep-freeze/blob/master/index.js)
function deepFreeze (o) {
  Object.freeze(o); // shallow freeze the top level
  Object.getOwnPropertyNames(o).forEach(function (prop) {
    if o[prop] != null // no point freezing null or undefined
    && (typeof o[prop] === "object" || typeof o[prop] === "function") {
      deepFreeze(o[prop]);
    }
  });
  return o;
};

// Usage
var x = {
  y: [1,2,3],
  z: function(){}
};
deepFreeze(x);

只是想看看这里是否有一些我不理解的基本知识,或者这是否只是为了防止函数对象发生变异,例如:x.z.foo = 3

最佳答案

在 Javascript 中,函数是对象。我知道这一点。

函数对象的所有原生属性(prototype 除外)都已经是不可变的:

var x = function(foo){}
Object.getOwnPropertyNames(x)
// ["length", "name", "arguments", "caller", "prototype"]
x.length; // 1, because there is one argument
x.length = 2;
x.length; // still 1.

但是您当然可以添加其他属性:

x.foo = 3;
x.foo; // 3

但我认为使用函数作为数据结构是极其不常见的。

真正引起我共鸣的评论是 Jared 的:

Its kinda pointless, but even more pointless to write code that treats functions differently than other objects.

人们可以向函数对象添加他们想要的任何属性,在某些情况下这可能是一个合理的解决方案,但我认为在其中存储值通常是意想不到的。然而,编写一个库函数来以不同于任何其他对象的方式对待函数没有任何好处。

结论:像常规对象一样锁定函数对象,因为为什么不这样做,而且它还关闭了有人可能为其赋值的极端情况。

关于javascript - Object.freeze 函数有什么理由吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38754907/

相关文章:

javascript - 在弹出窗口中打开不同的内容

java - 表示 API 返回不可修改/不可变集合的方法

javascript - 刷新后返回

JavaScript getElementById 返回 null 错误?

language-agnostic - 不可变集合上的非变异 "add"方法的最佳名称是什么?

scala - 更新序列中的多个值

java - 有什么好方法可以让不可变对象(immutable对象)链循环起来吗?

javascript - ImmutableJS - 只更新对象中的一个键值

javascript - Jquery/ajax循环SetTimeout

javascript - 根据按钮点击显示隐藏内容