如何在JavaScript中实现类似C++命名结构体的自定义对象类型?
实现C++风格命名结构体的方案
1. ES6类(最贴近C++结构体的原生方案)
类可以直接定义“类型”,通过new关键字创建多个实例,还能设置默认值,用法和C++结构体高度相似。比如实现包含子结构的Person类型:
// 定义Name子结构 class Name { constructor(givenName = '', familyName = '') { this.givenName = givenName; this.familyName = familyName; } } // 定义Person主结构 class Person { constructor(id = '', names = []) { this.id = id; this.names = names; // 存储Name对象数组 } } // 创建实例 const name1 = new Name('John', 'Doe'); const person1 = new Person('123', [name1]); const person2 = new Person('456', [new Name('Jane', 'Smith')]);
每个实例都有固定结构,编辑器也能提供自动补全提示。要实现People.Person这种命名空间式结构,直接把类挂载到对象上即可:
const People = {}; People.Person = class Person { constructor(id = '', names = []) { this.id = id; this.names = names; } }; // 嵌套子结构 People.Person.Name = class Name { constructor(givenName = '', familyName = '') { this.givenName = givenName; this.familyName = familyName; } }; // 使用方式 const myName = new People.Person.Name('Alice', 'Brown'); const myPerson = new People.Person('789', [myName]);
2. 工厂函数(轻量替代方案)
如果不想用类,工厂函数可以返回固定结构的对象,无需new关键字:
// 工厂函数实现Name function createName(givenName = '', familyName = '') { return { givenName, familyName }; } // 工厂函数实现Person function createPerson(id = '', names = []) { return { id, names }; } // 创建实例 const name3 = createName('Bob', 'Taylor'); const person3 = createPerson('101', [name3]);
这种方式返回的是普通对象,但结构固定,同样能被编辑器识别补全。命名空间写法类似:
const People = { Person: { create: function(id = '', names = []) { return { id, names }; }, Name: { create: function(givenName = '', familyName = '') { return { givenName, familyName }; } } } }; // 使用 const name4 = People.Person.Name.create('Charlie', 'Davis'); const person4 = People.Person.create('102', [name4]);
3. TypeScript增强类型约束(强类型场景推荐)
如果需要更严格的类型检查和完善的编辑器提示,TypeScript完全支持C++风格的命名结构体,语法更简洁:
// 定义Name结构体 interface Name { givenName: string; familyName: string; } // 定义Person结构体 interface Person { id: string; names: Name[]; } // 命名空间写法 namespace People { export interface Person { id: string; names: Person.Name[]; } export namespace Person { export interface Name { givenName: string; familyName: string; } } } // 创建实例 const tsName: People.Person.Name = { givenName: 'David', familyName: 'Wilson' }; const tsPerson: People.Person = { id: '103', names: [tsName] };
TypeScript会在编译阶段强制检查结构,确保实例符合定义的类型,非常适合习惯C++强类型的开发者。
内容的提问来源于stack exchange,提问作者Robert M.
相关产品推荐
相关产品推荐

