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

Но я думаю, что с помощью функция как структура данных чрезвычайно необычна.

Комментарий, который действительно резонирует со мной это Джаред:

Его любопытное бессмысленно, но даже больше смысла писать код, который рассматривает функции иначе, чем другие объекты.

Люди могут добавлять любые свойства, которые они хотят к объекту функции, и в некоторых случаях это может быть разумное решение, но я считаю, что типично неожиданно хранить там ценности. Однако писать библиотечную функцию для обработки функций по-другому, чем любой другой объект, ничего не получает.

Заключение: заблокируйте объект функции как обычный объект, потому что почему бы и нет, а также он закрывает угловой корпус, где кто-то может поместить на него значение.

+0

Использование функций как объектов является общим шаблоном в AngularJS –

+0

Каким образом, @HubertGrzeskowiak? Также обычно добавлять свойства к функциям, которые называются конструкторами (с «новым»), но этот вопрос, возможно, слишком неявно, касается структур данных. – SimplGy

Смежные вопросы