0

0

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

狼影

狼影

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

|

760人浏览过

|

来源于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免费学习笔记(深入)”;

知鹿匠
知鹿匠

知鹿匠教师AI工具,新课标教案_AI课件PPT_作业批改

下载
  • 必须用 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...inObject.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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

43

2026.02.13

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

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

160

2026.02.25

es6新特性
es6新特性

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

106

2023.07.17

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

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

197

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

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

231

2025.12.24

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

27

2025.11.27

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

768

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

25

2025.12.06

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

33

2026.03.04

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.7万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.5万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号