JavaScript 负责真正创建对象;TypeScript 不会发明新的运行时对象创建方式,它主要是在 JS 创建对象的基础上增加类型约束。
JS中创建对象的方法
一、对象字面量{}
对象字面量是最常见的对象创建方式,适合创建结构简单、一次性的对象。
const user = {
name: "Tom",
age: 20,
sayHi() {
console.log("Hi");
}
};二、new Object()
new Object() 也可以创建对象,但写法比较啰嗦,实际开发中通常使用对象字面量。
const user = new Object();
user.name = "Tom";
user.age = 20;三、构造函数创建对象
构造函数配合 new 使用,可以批量创建同一类对象。new 会创建一个新对象,并让构造函数内部的 this 指向这个新对象。
function User(name, age) {
this.name = name;
this.age = age;
}
const user1 = new User("Tom", 20);
const user2 = new User("Jerry", 22);四、原型模式
构造函数通常配合原型使用,把实例自己的属性放在构造函数里,把共享方法放在 prototype 上,避免重复创建方法,节省内存。
如果方法写在构造函数里,每创建一个对象都会复制一份方法:
function User(name) {
this.name = name;
this.sayHi = function () {
console.log(this.name);
};
}更好的方式是把共享方法放到原型上:
function User(name) {
this.name = name;
}
User.prototype.sayHi = function () {
console.log(this.name);
};
const user = new User("Tom");
user.sayHi();
// 这样所有实例共享同一个 sayHi 方法。五、class 创建对象
class 本质上还是基于原型机制的语法糖,它比构造函数更清晰,尤其适合面向对象写法。
ES6 以后更常用 class。
class User {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHi() {
console.log(this.name);
}
}
const user = new User("Tom", 20);六、Object.create()
Object.create() 可以创建一个指定原型的新对象,常用于理解和控制原型链。
Object.create() 可以指定新对象的原型。
const person = {
sayHi() {
console.log("Hi");
}
};
const user = Object.create(person);
user.name = "Tom";
user.sayHi(); // Hi
// 这里 user 的原型是 person。
// 还有一个特殊写法:
const obj = Object.create(null);
//这个对象没有原型
console.log(obj.toString); // undefined七、工厂函数创建对象
工厂函数通过函数封装对象创建逻辑,返回一个新对象,适合创建结构相似但不想使用 class 或构造函数的场景。
工厂函数就是普通函数返回一个对象。
function createUser(name, age) {
return {
name,
age,
sayHi() {
console.log(this.name);
}
};
}
const user = createUser("Tom", 20);八、使用展开运算符或 Object.assign() 创建新对象
展开运算符和 Object.assign() 常用于浅拷贝和对象合并,但它们只做浅拷贝,嵌套对象仍然共享引用。
这类方式常用于复制或合并对象。
const user = {
name: "Tom",
age: 20
};
const newUser = {
...user,
age: 21
};九、JSON.parse() 创建对象
常见于接口返回数据、本地存储数据解析。
const str = '{"name":"Tom","age":20}';
const user = JSON.parse(str);
// 这个对象来自 JSON 字符串解析。得到的是普通对象,不会自动带上类的方法。TS中创建对象方法
一、对象字面量 + 类型注解
这种方式直接,但类型写在变量旁边,复杂时不够优雅。
const user: { name: string; age: number } = {
name: "Tom",
age: 20
};二、使用 interface 约束对象
在 TS 中,interface 常用于描述对象结构,规定对象必须有哪些属性和方法。
interface User {
name: string;
age: number;
sayHi(): void;
}
const user: User = {
name: "Tom",
age: 20,
sayHi() {
console.log(this.name);
}
};三、使用type约束对象
interface 更适合描述对象、类、可扩展结构;type 更灵活,可以描述联合类型、交叉类型、复杂类型组合
type User = {
name: string;
age: number;
};
const user: User = {
name: "Tom",
age: 20
};四、使用class创建对象
TypeScript 中的 class 不仅可以创建对象,还可以通过类型注解、访问修饰符、接口实现等方式增强面向对象开发的安全性。
TS 里的 class 比 JS 多了类型检查。
class User {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
sayHi(): void {
console.log(this.name);
}
}
const user = new User("Tom", 20);
// 还可以加访问修饰符
class User {
public name: string;
private age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}五、构造函数类型
不过在 TS 里,更推荐使用 class,而不是传统构造函数。
function User(this: any, name: string, age: number) {
this.name = name;
this.age = age;
}六、工厂函数 + 返回类型
interface User {
name: string;
age: number;
}
function createUser(name: string, age: number): User {
return {
name,
age
};
}
const user = createUser("Tom", 20);
// 还可以用泛型
function createItem<T>(item: T): T {
return item;
}
const user = createItem({
name: "Tom",
age: 20
});七、Record 创建对象类型
如果对象的 key 和 value 有固定规则,可以用 Record。
type Scores = Record<string, number>;
const scores: Scores = {
math: 90,
english: 85
};
// key 是 string,value 是 number八、类型断言创建对象
类型断言不会真的创建属性,只是告诉编译器把某个值当成某种类型,所以不能滥用。
interface User {
name: string;
age: number;
}
const user = {} as User;
user.name = "Tom";
user.age = 20;
// 这种方式可以用,但要谨慎。实际上对象一开始是空的,只是你告诉 TS:“你相信我,它是 User 类型。”如果后面没有正确赋值,运行时可能出错。九、Partial<T> 创建部分对象
interface User {
name: string;
age: number;
email: string;
}
const user: Partial<User> = {
name: "Tom"
};
// Partial<User> 表示 User 里的属性都变成可选。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。