通常,您必须将一个对象作为参数传递。访问这些对象的函数是通过引用传递的,可以更改原始对象。视情况而定可能是不想要的结果。那么有什么方法可以冻结物体。我知道Object.freeze()的事
但它不影响内部的对象/数组。
例如
a = { arr: [1,2,3]};
Object.freeze(a);
a.arr.push(4); // still works
我理解在深度对象上递归以对其每个子属性执行浅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.getOwnProperty
下面是我试图用泛型注释时遇到的流错误的一个简化示例:
// @flow
function component<T>(state: T) {
let model = deepFreeze(state);
// ^ Cannot call `deepFreeze` with `state` bound to `o`
// because `T` [1] is incompatible with object type [2].
return {
update: (state: T) => {
如果我希望我的类是不可变的,我知道我可以使用Object.freeze()。现在,如果我希望我的对象在构造后是不可变的,我会将Object.freeze(this)作为最后一行放在构造函数中。但是现在,如果我想要子类,我不能添加更多的参数,因为我不能在调用this之前调用super,在调用super之后,它是不可变的:
class A {
constructor(x) {
this.x = x
Object.freeze(this)
}
}
class B extends A {
constructor(x, y) {
this.y = y // nope
你好,谢谢你的进阶。
我最近读到关于object.freez和deep.freez的文章。
考虑到js没有不可变的结构,我现在想知道这与不变性这一标准术语有什么不同。
:如前所述,JavaScript没有不变的结构,但不变可以通过原则和规则来实现。
如何看:
function deepFreeze(object) {
// Retrieve the property names defined on object
var propNames = Object.getOwnPropertyNames(object);
// Freeze properties
你好,我想知道是否有可能停止重写类型,使其在编译时保持不可变。 例如,我的意思是让我们创建一个接口 interface freeze{
frozen: boolean;
} 和深度冻结功能 function deepFreeze<T>(obj: T) {
var propNames = Object.getOwnPropertyNames(obj);
for (let name of propNames) {
let value = (obj as any)[name];
if (value && typeof value ===
考虑到以下可变和不可变类型的实现,有一种方法可以避免重复代码(主要是重复属性)
默认情况下,我希望使用不可变类型,除非需要可变类型(例如,绑定到UI元素时)。
我们正在使用.NET框架4.0,但计划很快切换到4.5。
public class Person {
public string Name { get; private set; }
public List<string> Jobs { get; private set; } // Change to ReadOnlyList<T>
public Person() {}
publi