可以不使用new创建对象吗
背景介绍
这是设计模式系列的第十三节,学习的是里设计模式中Hooks模式内容,由于是资料是英文版,所以我的学习笔记就带有翻译的性质,但并不是翻译,记录的是自己的学习过程和理解。
关于设计模式前十二节的内容,在文末会有直达链接。
极简释义
使用函数而不使用new关键字创建对象。
写在前面
在工厂模式,我们可以使用一个函数来创建对象,而不使用new关键字。
比如说我们程序中会有很多用户,每个用户都有姓有名,邮箱等属性,可以用工厂模式实现:
const createUser = ({ firstName, lastName, email }) => ({
firstName,
lastName,
email,
fullName() {
return `${this.firstName} ${this.lastName}`;
},
});
const user1 = createUser({
**firstName**: "John",
lastName: "Doe",
email: "john@doe.com"
});
const user2 = createUser({
firstName: "Jane2",
lastName: "Doe2",
email: "jane@doe.com"
});
console.log(user1);//{...}
console.log(user2.fullName()); //Jane2 Doe2
现在我们就可以调用createUser来创建用户对象了,并且新对象调用fullName方法获取全名了。
工厂模式在创建相对复杂些并且可配置的对象时是很有效的。另外当有些对象的键和值依赖配置得出时,也可以使用工厂模式轻松地创建:
const createObjectFromArray = ([key, value]) => ({
[key]: value,
});
createObjectFromArray(["name", "John"]); // { name: "John" }
总结
工厂模式对于创建多个共享属性且相对较小对象时是很有用的。工厂模式可以轻松地创建依赖环境或者用户配置的对象。
在JavaScript中,工厂模式仅仅是一个不使用new关键字,来创建对象的方法。ES6的箭头函数可以隐式返回一个简易的工厂方法。
通常情况下,使用工厂模式比使用new关键字更节约内存。
上面的案例使用new关键字实现如下:
class User {
constructor(firstName, lastName, email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
fullName() {
return `${this.firstName} ${this.lastName}`;
}
}
const user1 = new User({
firstName: "John",
lastName: "Doe",
email: "john@doe.com",
});
const user2 = new User({
firstName: "Jane",
lastName: "Doe",
email: "jane@doe.com",
});
设计模式相关推荐
第一节:单例模式:高并发造成的数据统计困难?看我单例模式一招制敌
第二节:替身模式:JS和迪丽热巴一样有专业替身?没听过的快来补补课...
第三节:供应商模式:还在层层传递props?来学学非常实用的供应商模式吧
第四节:原型模式:都知道JavaScript原型,但设计模式里的原型模式你会用吗?
第五节:视图和逻辑分离模式:React Hooks时代,怎么实现视图与逻辑分离呢?
第六节:观察者模式:是时候拿出高级的技术了————观察者模式
第七节:模块化模式:前端性能优化进阶篇——动态加载模块基础补遗
第八节:混合模式:在React Hook时代,Object.assign这种混合写法还要用吗?
第九节:中间件模式:如何使用中间件优化多对多通信?
第十节:高阶组件模式:在React Hooks时代,高阶组件只能感叹:既生瑜何生亮?
第十一节:传递render方法模式:如何在提升state的层级时,避免父级子组件重新渲染问题
第十二节:React Hooks:和React Hook相比class Component到底差在哪
第十三节:享元模式:什么?没听说过享元模式,快来学学
相关活动
转载自:https://juejin.cn/post/7210375037115531320