是否有任何理由Object.freeze函数?

问题描述:

我明白在一个深层对象上递归的意义,以便对它的每个子属性做一个浅Object.freeze。冻结函数对象的值有什么意义?该引用已经被冻结,因为较高级别的浅层冻结 - 是否可以改变函数对象的值本身?是否有任何理由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

+1

函数仍然是一个可以扩展的对象。你的困境是什么? – MaxArt

+2

函数也是JS中的一个对象(只有一个可以执行)。它可以像其他任何对象一样扩展。 – Thomas

+1

函数是可以添加/删除属性的对象。所以一般来说,如果你想要一个对象完全冻结,你会想冻结任何函数。 –

在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的:

它有点毫无意义,但更毫无意义的写不同对待的功能比其他对象的代码。

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

结论:像常规对象一样锁定函数对象,因为为什么不这样做,并且它关闭了某个角落的情况,有些人可能会在其上放置一个值。

+0

使用函数作为对象是AngularJS中的常见模式 –

+0

以何种方式,@HubertGrzeskowiak?将属性添加到打算称为构造函数的函数中(通常用'new'),但这个问题可能太隐含地关于数据结构。 – SimplGy