Programming

자바 스크립트의 구조체

procodes 2020. 8. 24. 21:19
반응형

자바 스크립트의 구조체


이전에는 여러 관련 변수를 저장해야 할 때 클래스를 만들었습니다.

function Item(id, speaker, country) {
    this.id = id;
    this.speaker = spkr;
    this.country = country;
}
var myItems = [
    new Item(1, 'john', 'au'),
    new Item(2, 'mary', 'us')
];

그러나 이것이 좋은 습관인지 궁금합니다. Javascript에서 구조체를 시뮬레이션하는 다른 더 나은 방법이 있습니까?


객체 리터럴과 생성 된 객체의 유일한 차이점은 프로토 타입에서 상속 된 속성입니다.

var o = {
  'a': 3, 'b': 4,
  'doStuff': function() {
    alert(this.a + this.b);
  }
};
o.doStuff(); // displays: 7

구조체 팩토리를 만들 수 있습니다.

function makeStruct(names) {
  var names = names.split(' ');
  var count = names.length;
  function constructor() {
    for (var i = 0; i < count; i++) {
      this[names[i]] = arguments[i];
    }
  }
  return constructor;
}

var Item = makeStruct("id speaker country");
var row = new Item(1, 'john', 'au');
alert(row.speaker); // displays: john

나는 항상 객체 리터럴을 사용합니다.

{id: 1, speaker:"john", country: "au"}

진짜 문제는 언어의 구조가 참조 유형이 아닌 값 유형이어야한다는 것입니다. 제안 된 답변은 구조 대신 객체 (참조 유형)를 사용하는 것이 좋습니다. 이것이 그 목적을 달성 할 수 있지만, 프로그래머가 참조 유형 대신 값 유형 (프리미티브와 같은)을 사용하는 이점을 실제로 원한다는 점을 회피합니다. 값 유형은 메모리 누수를 일으키지 않아야합니다.


나는 당신이했던 것처럼 C와 같은 구조체를 시뮬레이션하는 클래스를 만드는 것이 가장 좋은 방법이라고 생각합니다.

관련 데이터를 그룹화하고 매개 변수를 함수에 전달하는 것을 단순화하는 좋은 방법입니다. 또한 실제 객체 지향 기능을 시뮬레이션하는 데 필요한 추가 노력을 고려할 때 JavaScript 클래스가 C ++ 클래스보다 C ++ 구조체와 비슷하다고 주장 합니다.

JavaScript를 다른 언어와 비슷하게 만들려는 시도가 빠르게 복잡하다는 것을 발견했지만 JavaScript 클래스를 함수없는 구조체로 사용하는 것을 완벽하게 지원합니다.


Markus의 답변에 따라 최신 버전의 JS (ES6 내 생각에)에서는 Arrow FunctionsRest Parameter 를 사용하여 더 간단하게 'struct'팩토리를 만들 수 있습니다 .

const Struct = (...keys) => ((...v) => keys.reduce((o, k, i) => {o[k] = v[i]; return o} , {}))
const Item = Struct('id', 'speaker', 'country')
var myItems = [
    Item(1, 'john', 'au'),
    Item(2, 'mary', 'us')
];

console.log(myItems);
console.log(myItems[0].id);
console.log(myItems[0].speaker);
console.log(myItems[0].country);

이를 실행 한 결과는 다음과 같습니다.

[ { id: 1, speaker: 'john', country: 'au' },
  { id: 2, speaker: 'mary', country: 'us' } ]
1
john
au

Python의 namedtuple과 비슷하게 만들 수 있습니다.

const NamedStruct = (name, ...keys) => ((...v) => keys.reduce((o, k, i) => {o[k] = v[i]; return o} , {_name: name}))
const Item = NamedStruct('Item', 'id', 'speaker', 'country')
var myItems = [
    Item(1, 'john', 'au'),
    Item(2, 'mary', 'us')
];

console.log(myItems);
console.log(myItems[0].id);
console.log(myItems[0].speaker);
console.log(myItems[0].country);

결과 :

[ { _name: 'Item', id: 1, speaker: 'john', country: 'au' },
  { _name: 'Item', id: 2, speaker: 'mary', country: 'us' } ]
1
john
au

멍청한 구조체 (멤버 함수 없음)에 객체 JSON 스타일을 사용합니다.


ES6 호환성으로 작업하는 경우 구조체를 정의하기 위해 작은 라이브러리를 만들었습니다.

여기에서 프로젝트 저장소를 확인할 수있는 JKT 파서입니다. JKT 파서

예를 들어 다음과 같이 구조체를 만들 수 있습니다.

const Person = jkt`
    name: String
    age: Number
`

const someVar = Person({ name: "Aditya", age: "26" })

someVar.name // print "Aditya"
someVar.age // print 26 (integer)

someVar.toJSON() // produce json object with defined schema 

참고URL : https://stackoverflow.com/questions/502366/structs-in-javascript

반응형