讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

剧云
剧云

中文短剧剧本制作平台

javascript如何创建对象_工厂模式和构造函数哪个更好

酷杰酱_9489

酷杰酱_9489

发布时间:2026-01-08 16:18:53

|

800人浏览过

|

来源于php中文网

原创

应优先使用构造函数或class而非工厂模式。因工厂模式返回Object实例,丢失类型信息,instanceof判断失效;而构造函数和class能建立明确类型关系、支持继承与原型方法,保障类型系统有效性。

javascript如何创建对象_工厂模式和构造函数哪个更好

工厂模式创建对象:简单但丢失类型信息

工厂模式本质是用函数封装 Object 创建逻辑,适合快速产出结构一致的对象,但返回的全是 Object 实例,没有专属构造器标识。

常见错误是误以为 instanceof MyFactory 有意义——它永远是 false,因为工厂函数本身不是构造器。

  • 适用场景:配置项生成、DTO 转换、不需要继承或类型校验的临时对象
  • 无法用 instanceof 判断来源,obj.constructor 指向 Object
  • 所有实例共享同一套原型链,没法挂载独有方法到原型上
function createPerson(name, age) {
  return {
    name,
    age,
    greet() { return `Hi, I'm ${this.name}`; }
  };
}
const p1 = createPerson('Alice', 30);
console.log(p1 instanceof createPerson); // false
console.log(p1.constructor === Object); // true

构造函数创建对象:有类型、可继承、但易忘写 new

构造函数配合 new 调用,会自动绑定 this、设置 __proto__、返回实例,关键在于它能建立明确的类型关系和原型链。

最常踩的坑是直接调用构造函数(不加 new),导致 this 指向全局(非严格模式)或 undefined(严格模式),属性挂错地方甚至报错。

立即学习“Java免费学习笔记(深入)”;

Speak Turbo - Talk to your Claude 90ms latency!
Speak Turbo - Talk to your Claude 90ms latency!

赋予Agent实时语音交互能力。与Claude对话!超快TTS文字转语音,约90毫秒低延迟音频输出。

下载
  • 必须用 new 调用,否则行为完全失控
  • instanceof Person 返回 true,可用于类型判断和多态
  • 方法可定义在 Person.prototype 上,节省内存
function Person(name, age) {
  if (!(this instanceof Person)) {
    throw new Error('Person must be called with new');
  }
  this.name = name;
  this.age = age;
}
Person.prototype.greet = function() {
  return `Hi, I'm ${this.name}`;
};
const p2 = new Person('Bob', 25);
console.log(p2 instanceof Person); // true

ES6 class 是构造函数的语法糖,不是新机制

class 写法看着更清晰,但底层仍是基于原型的构造函数。它强制使用 new,且不支持函数表达式式提升,比传统构造函数更安全一点。

注意:类中定义的方法默认不可枚举,而构造函数 prototype 上手动添加的方法默认可枚举——这点会影响 for...in 或 Object.keys() 的结果。

  • class 声明不会被提升,必须先定义后使用
  • 静态方法用 static 关键字,对应构造函数自身的属性
  • 依然不能用 typeof MyClass 判断实例类型,得靠 instanceof
class Animal {
  constructor(name) {
    this.name = name;
  }
  speak() {
    return `${this.name} makes a noise.`;
  }
}
const dog = new Animal('Rex');
console.log(dog instanceof Animal); // true

选哪个?看你要不要「类型契约」

如果只是拼个对象交差,工厂模式写起来快、无负担;但只要涉及后续扩展、多人协作、类型检查(比如 TypeScript)、或者要和其他类做 instanceof 判断,就必须用构造函数或 class。

真正容易被忽略的是:工厂模式返回的对象无法被 instanceof 正确识别,这在大型项目里会让类型守卫失效、调试时查不到构造来源、序列化/反序列化逻辑出错。

别为了省一个 new 字符,放弃整个类型系统的基础支撑。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

332

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

540

2026.02.25

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

411

2026.03.13

TypeScript 全栈开发进阶指南
TypeScript 全栈开发进阶指南

面向有 JavaScript 基础的开发者,深入讲解 TypeScript 的类型系统与全栈开发实践。

326

2026.06.03

TypeScript Node.js 全栈工程化与Monorepo架构实践
TypeScript Node.js 全栈工程化与Monorepo架构实践

本专题围绕 TypeScript 在 Node.js 全栈开发中的工程化实践展开,系统讲解 Monorepo 架构设计、包管理策略、模块复用机制以及服务端与前端统一类型系统的构建方法。通过真实项目案例,帮助开发者提升大型全栈项目的可维护性与协作效率。

758

2026.06.16

es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

305

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

406

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

395

2025.12.24

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn