object 中文翻译是对象,它是面向对象编程也就是 OOP 里面最核心的数据结构,本质是把数据和操作数据的方法打包成一个独立实体,和传统单独变量或者单独函数的写法不一样,object 内部同时存放属性也就是数据,还有方法也就是行为,在 JavaScript Java Python C++ 等绝大多数现代编程语言里面都存在 object 这个概念,但是不同语言对 object 底层实现语法定义有差别,JavaScript 里面 object 属于引用类型,Python 里面几乎所有值都可以视作 object,Java 里面 object 是所有类的根父类,很多初学者容易混淆普通变量和 object,核心区别就是普通变量只存单值,object 可以组合多组属性和函数,还支持实例化继承多态这些面向对象特性。
基础核心定义
object 就是一个封装单元,把状态和行为绑定在一起,状态就是属性,用来保存描述这个实体的数据,行为就是方法,用来修改属性或者执行对应的业务逻辑。
| 语言 | object 特点 | 语法特征 |
|---|---|---|
| JavaScript | object 是引用类型,支持字面量直接创建 | const obj = {name:"test"} |
| Python | 所有类实例都是 object,内置 object 是顶层基类 | class MyClass(object) |
| Java | java.lang.Object 是全部类的父类 | Object o = new Object() |
| C++ | object 是类实例,属于值语义为主 | MyObject obj; |
object 核心组成部分
1 属性,也叫成员变量,用来保存实体相关数据,比如名称 编号 尺寸 状态标记
2 方法,也叫成员函数,依附在 object 上的函数,可以读取或者修改自身属性
3 引用标识,引用类型语言里面,变量保存的不是 object 本身,而是内存地址,复制变量只是复制地址,不是完整复制对象内容
4 生命周期,object 会在内存创建,不再被引用之后,由垃圾回收机制自动释放内存
面向对象三大特性和 object 关联
封装,把内部属性隐藏,对外只暴露必要方法,也就是把内部细节封装在 object 内部,外部不能随意修改私有属性
继承,新建的子类 object 可以继承父类 object 已经有的属性和方法,减少重复代码
多态,同一个方法调用,不同 object 实例执行不一样的逻辑,同一个接口不同 object 实现各自行为
常见创建 object 的方式
第一步 字面量创建,适合简单 object,直接写大括号填入键值对,开发里面最常用
第二步 构造函数创建,通过 class 类或者构造函数批量生成同类型 object 实例
第三步 工厂函数创建,函数内部返回一个新 object,适合批量生成结构一致对象
第四步 内置 Object 构造器创建,调用 new Object,一般很少使用,大多优先字面量写法
容易混淆的关键点
引用类型陷阱,JS 里面如果把 objA 赋值给 objB,两个变量指向同一个内存 object,修改 objB 属性,objA 也会跟着变化,这是新手高频报错点
浅拷贝和深拷贝,浅拷贝只复制 object 第一层属性,如果属性本身又是嵌套 object,内层仍然是共享引用,深拷贝会完整复制所有嵌套层级,生成完全独立新 object
空 object,也就是没有任何属性方法的 object,仍然是合法 object 实例,可以后续动态添加属性,JS 支持动态增删属性,Java 原生 Object 实例不能动态新增属性
拓展其他领域 object 含义
除编程领域,object 在计算机其他场景也有含义,比如三维建模里面 object 指场景物体,数据库里面 object 指数据库对象,包含表 视图 存储过程,文件系统里面 object 也可以指代文件对象,还有计算机图形学 object 就是渲染实体,使用的时候要结合上下文判断具体含义。
总结
object 是面向对象编程的基础单元,把属性和方法封装在一起,不同编程语言对 object 的底层模型语法存在差异,引用类型语言重点理解内存引用垃圾回收浅拷贝深拷贝,使用 object 可以让代码模块化,复用性更强,适合复杂业务系统开发。
【常见问题】
问题 1 object 和 class 有什么区别
回答 1 object 是类实例化之后得到的实体,class 是模板,class 定义结构,运行时根据 class 生成对应的 object,class 相当于图纸,object 就是按照图纸造出来的实物。
问题 2 object 在 JavaScript 里面是基本数据类型吗
回答 1 object 在 JavaScript 里面不属于基本数据类型,它属于引用类型,存储在堆内存,变量保存的是内存引用地址,和数字字符串布尔这类基础值类型不一样。
问题 3 object 浅拷贝和深拷贝差别是什么
回答 3 object 浅拷贝只复制第一层属性,嵌套的子 object 仍然共享原有引用,修改子对象会互相影响,object 深拷贝会递归复制全部嵌套内容,生成完全独立的新 object,互不干扰。
问题 4 object 垃圾回收是什么原理
回答 3 object 不再被任何变量引用的时候,语言内置垃圾回收器会识别这个无效 object,回收它占用的堆内存,释放空间给新的 object 使用,不需要开发者手动释放内存。
【免责申明】
本文为编程概念科普内容,不同编程语言版本语法会存在更新,代码示例仅作原理演示,实际项目开发请参考对应语言官方文档,本文不构成项目开发方案推荐。


