JavaScript/JS 활용 & etc..

자바스크립트의 객체 상수

jaiyah 2016. 10. 30. 09:30

객체 상수

자바스크립트에는 상수가 없지만 대다수 최신 브라우저 환경에서는 const 문을 통해 상수를 생성할 수 있습니다.

흔히 사용되는 우회적인 방법으로, 명명 규칙을 사용하여 값이 변경되지 말아야 하는 변수명을 모두 대문자로 쓰기도 합니다.

이 규칙은 실제로 자바스크립트 내장 객체에서도 사용됩니다.

javascript
Math.PI; // 3.1415922653589793
Math.SQRT2; // 1.4142135623720951
Number.MAX_VALUE; // 1.7976931348623157e+308

사용자 정의 상수에도 동일한 명명 규칙을 적용하여, 생성자 함수에 스태틱 프로퍼티로 추가할 수 있습니다.

javascript
// 생성자
var Widget = function () {
	// 생성자 구현내용...
};

// 상수
Widget.MAX_HEIGHT = 320;
Widget.MAX_WIDTH = 480;


객체 리터럴로 생성한 객체에도 동일한 명명 규칙을 적용할 수 있습니다.

즉, 대문자로 쓴 일반적인 프로퍼티를 상수로 간주하는 것입니다.

실제로도 값이 변경되지 않게 하고 싶다면, 비공개 프로퍼티를 만든 후, 값을 설정하는 메서드(setter) 없이 값을 반환하는 메서드(getter)만 제공하는 방법도 고려해 볼 만 합니다.

그러나 대부분의 경우에는 단순히 명명 규칙만으로도 충분하기 때문에 이 방법은 좀 과도할 수 있습니다.




이어질 예제는 다음과 같은 메서드를 제공하는 범용 constant 객체를 구현한 것입니다.

  • set(name, value) : 새로운 상수를 정의한다.
  • isDefined(name) : 특정 이름의 상수가 있는지 확인한다.
  • get(name) : 상수의 값을 가져온다.

이 예제에서는 상수 값으로 원시 데이터 타입만 허용됩니다.

또한 선언하려는 상수의 이름이 toString 이나 hasOwnProperty 등 내장 프로퍼티의 이름과 겹치지 않도록 보장하기 위해 hasOwnProperty() 를 사용한 별도의 확인 작업을 거칩니다.

마지막으로 모든 상수의 이름 앞에 임으로 생성된 접두어를 붙입니다.

javascript
var constant = function () {
	
	var constants = {},
	    ownProp   = Object.prototype.hasOwnProperty,
	    allowed   = {
		    string : 1,
		    number : 1,
		    boolean: 1
	    },
	    prefix    = (Math.random() + "_").slice(2);
	
	return {
		set : function (name, value) {
			if (this.isDefined(name)) {
				return false;
			}
			if (!ownProp.call(allowed, typeof value)) {
				return false;
			}
			constants[prefix + name] = value;
			return true;
		},
		isDefined : function (name) {
			return ownProp.call(constants, prefix + name);
		},
		get : function (name) {
			if (this.isDefined(name)) {
				return constants[prefix + name];
			}
			return null;
		}
	}
	
}();

아래에서 테스트 해보도록 합니다.

javascript
// 이미 정의되었는지 확인한다.
console.log(constant.isDefined('maxwidth')); // false 가 기록

// 정의한다.
console.log(constant.set('maxwidth', 480)); // true 가 기록

// 다시 정의를 시도해 본다.
console.log(constant.isDefined('maxwidth')); // true 가 기록

// 값은 그대로인가?
console.log(constant.get('maxwidth')); // 480 이 기록



Jaehee's WebClub