2016-08-03 1 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의 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

관련 문제