코드에서 상수 class
를 찾는 것이 합리적이기 때문에에 상수를 구현하고 싶습니다 .
지금까지 정적 메소드를 사용하여 다음 해결 방법을 구현했습니다.
class MyClass {
static constant1() { return 33; }
static constant2() { return 2; }
// ...
}
나는 프로토 타입으로 바이올린을 칠 가능성이 있다는 것을 알고 있지만 많은 사람들이 이것을 반대하는 것이 좋습니다.
ES6 클래스에서 상수를 구현하는 더 좋은 방법이 있습니까?
답변
수행 할 수있는 몇 가지 작업은 다음과 같습니다.
내보내기 const
으로부터 모듈 . 사용 사례에 따라 다음을 수행 할 수 있습니다.
export const constant1 = 33;
필요한 경우 모듈에서 가져옵니다. 또는 정적 메소드 아이디어를 기반으로 static
get 접근 자를 선언 할 수 있습니다 .
const constant1 = 33,
constant2 = 2;
class Example {
static get constant1() {
return constant1;
}
static get constant2() {
return constant2;
}
}
그렇게하면 괄호가 필요하지 않습니다.
const one = Example.constant1;
그런 다음 말했듯이 a class
는 함수의 구문 설탕이므로 쓰기 불가능한 속성을 다음과 같이 추가 할 수 있습니다.
class Example {
}
Object.defineProperty(Example, 'constant1', {
value: 33,
writable : false,
enumerable : true,
configurable : false
});
Example.constant1; // 33
Example.constant1 = 15; // TypeError
다음과 같이 할 수 있다면 좋을 것입니다.
class Example {
static const constant1 = 33;
}
그러나 불행히도이 클래스 속성 구문 은 ES7 제안에만 있으며 심지어 const
속성 에 추가 할 수는 없습니다 .
답변
class Whatever {
static get MyConst() { return 10; }
}
let a = Whatever.MyConst;
나를 위해 일하는 것 같습니다.
답변
나는 사용하고있다 babel
하고 있으며 다음 구문이 나를 위해 일하고있다 :
class MyClass {
static constant1 = 33;
static constant2 = {
case1: 1,
case2: 2,
};
// ...
}
MyClass.constant1 === 33
MyClass.constant2.case1 === 1
사전 설정이 필요하다는 것을 고려하십시오 "stage-0"
.
설치하려면 :
npm install --save-dev babel-preset-stage-0
// in .babelrc
{
"presets": ["stage-0"]
}
최신 정보:
현재 사용 stage-3
답변
프로토 타입 데이터 속성 (메소드 이외의) 클래스 속성 또는 인스턴스 속성을 정의하기위한 (의도적으로) 직접적인 선언적 방법은 없습니다
이것은 의도적으로 이와 같다는 것을 의미합니다.
생성자에서 변수를 정의 할 수 있습니까?
constructor(){
this.key = value
}
답변
사용하는 것도 가능하다 Object.freeze
불변하게 할 수 클래스 (ES6) / 생성자 함수 (ES5) 객체 :
class MyConstants {}
MyConstants.staticValue = 3;
MyConstants.staticMethod = function() {
return 4;
}
Object.freeze(MyConstants);
// after the freeze, any attempts of altering the MyConstants class will have no result
// (either trying to alter, add or delete a property)
MyConstants.staticValue === 3; // true
MyConstants.staticValue = 55; // will have no effect
MyConstants.staticValue === 3; // true
MyConstants.otherStaticValue = "other" // will have no effect
MyConstants.otherStaticValue === undefined // true
delete MyConstants.staticMethod // false
typeof(MyConstants.staticMethod) === "function" // true
클래스를 변경하려고하면 소프트 실패가 발생합니다 (오류가 발생하지 않으며 단순히 효과가 없습니다).
답변
어쩌면 모든 상수를 얼어 붙은 물체에 넣었습니까?
class MyClass {
constructor() {
this.constants = Object.freeze({
constant1: 33,
constant2: 2,
});
}
static get constant1() {
return this.constants.constant1;
}
doThisAndThat() {
//...
let value = this.constants.constant2;
//...
}
}
답변
마찬가지로 https://stackoverflow.com/users/2784136/rodrigo-botti는 말했다, 당신이 찾고있는 생각합니다 Object.freeze()
. 불변의 스태틱이있는 클래스의 예는 다음과 같습니다.
class User {
constructor(username, age) {
if (age < User.minimumAge) {
throw new Error('You are too young to be here!');
}
this.username = username;
this.age = age;
this.state = 'active';
}
}
User.minimumAge = 16;
User.validStates = ['active', 'inactive', 'archived'];
deepFreeze(User);
function deepFreeze(value) {
if (typeof value === 'object' && value !== null) {
Object.freeze(value);
Object.getOwnPropertyNames(value).forEach(property => {
deepFreeze(value[property]);
});
}
return value;
}