2016-08-03 15 views
4

私はそれのすべての子プロパティに浅い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を。 JavaScriptで

+1

関数はまだ拡張可能なオブジェクトです。あなたのジレンマは何ですか? – MaxArt

+2

関数は、JS内のObject(実行可能なもの)でもあります。他のオブジェクトと同様に、追加のプロパティで拡張できます。 – Thomas

+1

関数は、プロパティを追加/削除できるオブジェクトです。ですから、一般的に、オブジェクトを完全にフリーズしたい場合は、すべての関数をフリーズする必要があります。 –

答えて

2

、機能がオブジェクトです。私はこれを知っていた。

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. 

しかし、あなたは、もちろん、他のプロパティを追加することができます:

prototype除く)関数オブジェクトのネイティブプロパティのすべて

はすでに不変です

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

しかし、私が使用して考えますデータ構造としての機能は非常に珍しいものです。本当に私と共鳴

コメントはジャレッドのです:

そのちょっと無意味な、しかし他のオブジェクトとは異なる機能を扱うコードを書くために、さらに無意味。

人は関数オブジェクトに任意のプロパティを追加できますが、場合によっては妥当な解決策かもしれませんが、値を格納するのは予想外のことです。しかし、他のオブジェクトとは異なる関数を扱うライブラリ関数を書くことは何も得られません。

結論:理由はなぜだけではなく、通常のオブジェクトと同じように関数オブジェクトをロックダウンし、またそれは、誰かがそれに価値を置くかもしれないコーナーケースを閉じます。

+0

関数をオブジェクトとして使用することはAngularJSの共通パターンです –

+0

どのようにして@HubertGrzeskowiak?コンストラクタとして呼び出されることを意図した関数( 'new'を含む)にプロパティを追加するのも一般的ですが、この質問はあまりにも暗黙的にデータ構造についてです。 – SimplGy

関連する問題