Sim*_*lGy 6 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);
Run Code Online (Sandbox Code Playgroud)
只是试着看看有什么基本的东西,我在这里不理解,或者这只是防止变异的功能对象,例如: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.
Run Code Online (Sandbox Code Playgroud)
但是您当然可以添加其他属性:
x.foo = 3;
x.foo; // 3
Run Code Online (Sandbox Code Playgroud)
但我认为使用函数作为数据结构是非常不常见的。
真正引起我共鸣的是 Jared 的评论:
这有点毫无意义,但编写以不同于其他对象的方式处理函数的代码更毫无意义。
人们可以向函数对象添加他们想要的任何属性,在某些情况下这可能是一个合理的解决方案,但我认为在那里存储值通常是意想不到的。然而,编写一个库函数来以不同于任何其他对象的方式对待函数,不会带来任何好处。
结论:就像锁定常规对象一样锁定函数对象,因为为什么不呢,而且它还关闭了有人可能对其赋值的极端情况。