写代码的时候,对象几乎无处不在。不管是处理用户信息,还是封装一组操作逻辑,我们都会用到对象。但你有没有想过,创建一个对象其实有好几种方式?不同的场景下,选择合适的方法能让代码更清晰、更高效。
构造函数方式
这是最常见的一种方式。比如你要做一个电商系统里的商品管理,可以定义一个构造函数来生成商品对象:
function Product(name, price) {
this.name = name;
this.price = price;
this.discount = function() {
return this.price * 0.9;
};
}
const apple = new Product('苹果', 10);
console.log(apple.discount()); // 输出 9
每次用 new 关键字调用,就能得到一个独立的商品实例。适合需要复用结构和方法的场景。
对象字面量
如果只是临时用一下,比如配置项或者传参,直接写个字面量最省事。就像你点外卖时选配送时间,可能就简单写个选项对象:
const deliveryOption = {
time: '18:30',
remark: '放门口,别打电话',
urgent: true
};
sendOrder(deliveryOption);
这种方式简洁明了,不需要重复生成多个实例,适合一次性使用的数据结构。
工厂函数
有时候你不想要 new,又希望封装创建逻辑。这时候工厂函数就很自然。比如你要根据不同类型生成用户对象:
function createUser(type, name) {
if (type === 'admin') {
return {
name: name,
role: 'admin',
accessLevel: 9
};
} else {
return {
name: name,
role: 'user',
accessLevel: 1
};
}
}
const admin = createUser('admin', '张三');
不用管是不是用了 new,返回的就是一个对象,逻辑集中,扩展也方便。
ES6 Class 创建
现在很多人习惯用 class 写法,看起来更像传统面向对象语言。比如做个订单类:
class Order {
constructor(id, amount) {
this.id = id;
this.amount = amount;
}
pay() {
console.log(`订单 ${this.id} 支付成功,金额 ${this.amount}`);
}
}
const order = new Order('O001', 299);
order.pay();
虽然底层还是基于原型,但语法更清晰,尤其团队协作时,更容易理解意图。
Object.create()
这个方式不太常用,但在某些需要明确指定原型的场景特别有用。比如你想让某个对象继承一套默认配置:
const defaultConfig = {
theme: 'light',
autoSave: true
};
const userConfig = Object.create(defaultConfig);
userConfig.theme = 'dark'; // 覆盖默认值
console.log(userConfig.autoSave); // true,来自原型
这样既保留了默认行为,又能灵活覆盖,适合做配置继承或原型链控制。
每种方式都有它的位置。构造函数适合复杂实例,字面量适合简单数据,工厂函数适合多态逻辑,class 更适合大型项目结构,而 Object.create() 则在需要精细控制原型时派上用场。实际开发中,往往是混合使用,看哪个更顺手、更符合当前需求。