답변:
객체 리터럴과 생성 된 객체의 유일한 차이점은 프로토 타입에서 상속 된 속성입니다.
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"}
new READABLE_PART(ignore everything in here)
아닌 스캔하기 쉽고 자체 문서화가됩니다 {read: "ignore", everything: "ignore", in: "ignore", here: "ignore"} // and then come up with READABLE_PART
. 첫 번째 버전은 빠르게 페이징하면서 읽을 수 있습니다. 두 번째는 이해하기 위해 구조체로 리팩토링하는 것입니다.
나는 당신이했던 것처럼 C와 같은 구조체를 시뮬레이션하는 클래스를 만드는 것이 가장 좋은 방법이라고 생각합니다.
관련 데이터를 그룹화하고 매개 변수를 함수에 전달하는 것을 단순화하는 좋은 방법입니다. 또한 실제 객체 지향 기능을 시뮬레이션하는 데 필요한 추가 노력을 고려할 때 JavaScript 클래스가 C ++ 클래스보다 C ++ 구조체와 비슷하다고 주장 합니다.
JavaScript를 다른 언어와 비슷하게 만들려는 시도가 빠르게 복잡하다는 것을 발견했지만 JavaScript 클래스를 함수없는 구조체로 사용하는 것을 완벽하게 지원합니다.
Markus의 답변에 따라 최신 버전의 JS (ES6 내 생각에)에서는 Arrow Functions 및 Rest 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
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
설정하는 데 더 많은 작업이 필요하지만 유지 관리가 한 번의 노력을 능가한다면 이것이 귀하의 경우가 될 수 있습니다.
/**
* @class
*/
class Reference {
/**
* @constructs Reference
* @param {Object} p The properties.
* @param {String} p.class The class name.
* @param {String} p.field The field name.
*/
constructor(p={}) {
this.class = p.class;
this.field = p.field;
}
}
장점 :