-
对象基础
- 对象的定义与字面量语法
- 属性的访问方式:点符号 vs. 方括号
- 动态添加/删除属性
- 对象方法(函数作为属性)
- 对象引用特性(浅拷贝 vs. 深拷贝)
-
构造函数
new
关键字的作用机制- 构造函数与普通函数的区别
- 手动实现构造函数返回值的影响
-
原型(Prototype)
- 原型对象(
prototype
属性) - 隐式原型引用(
__proto__
,已弃用,建议用Object.getPrototypeOf()
) - 原型链的继承机制
constructor
属性的作用与修正- 原型链的终点:
Object.prototype
→null
- 原型对象(
-
创建对象的模式
- 工厂模式(简单封装)
- 构造函数模式(实例独立属性)
- 原型模式(共享属性与方法)
- 组合模式(构造函数 + 原型,最常用)
- ES6 的
class
语法(语法糖,本质基于原型)
-
继承的实现方式
- 原型链继承(缺点:引用属性共享)
- 构造函数继承(缺点:方法无法复用)
- 组合继承(原型链 + 构造函数,优化版)
- 原型式继承(
Object.create()
的底层逻辑) - 寄生组合继承(最理想的继承方案)
- ES6
extends
与super
关键字
-
关键方法与操作
Object.create()
(指定原型创建对象)Object.getPrototypeOf()
/Object.setPrototypeOf()
instanceof
的原理与局限性Object.prototype.isPrototypeOf()
hasOwnProperty()
检测自身属性in
操作符(遍历原型链属性)
-
属性描述符
- 数据描述符:
value
,writable
,enumerable
,configurable
- 存取描述符:
get
,set
Object.defineProperty()
/Object.defineProperties()
Object.getOwnPropertyDescriptor()
- 数据描述符:
-
ES6+ 特性扩展
- 属性与方法简写(
{ x, method() {} }
) - 计算属性名(
{ [key]: value }
) super
关键字在对象方法中的使用- 对象扩展运算符(
{ ...obj }
浅拷贝)
- 属性与方法简写(
-
常见问题与陷阱
- 修改内置对象原型的风险(如
Array.prototype
) - 原型链过长导致的性能问题
for...in
遍历时原型属性的干扰- 循环引用与深拷贝的实现挑战
- 修改内置对象原型的风险(如
-
最佳实践
- 优先使用
Object.create(null)
创建纯净字典对象 - 避免直接修改
__proto__
,使用标准 API - 使用
class
语法简化面向对象代码 - 明确区分实例属性与原型属性
- 优先使用
-
示例:原型链关系验证
function Person() {} const p = new Person(); // 原型链:p → Person.prototype → Object.prototype → null console.log(p instanceof Person); // true console.log(Object.getPrototypeOf(p) === Person.prototype); // true