2016-08-03 105 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

+1

函數仍然是一個可以擴展的對象。你的困境是什麼? – MaxArt

+2

函數也是JS中的一個對象(只有一個可以執行)。它可以像其他任何對象一樣擴展。 – Thomas

+1

函數是可以添加/刪除屬性的對象。所以一般來說,如果你想要一個對象完全凍結,你會想凍結任何函數。 –

回答

2

在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

相關問題