ECMAScript原型
原型、构造函数、new、class 之间关系的导航笔记。
#synthesis
#growing
#javascript
#ecmascript
[!info] related notes
- 所属 MOC: ECMAScript MOC, ECMAScript 面向对象
- 原子概念: js原型和原型链, js构造函数, js-new, proto-prototype-constructor, js-class, this 关键字
- 认知纠偏: 为什么说-js-是基于原型而不是基于类
ECMAScript原型
这篇笔记只保留原型主题的关系入口,不再和原子笔记重复展开定义。
建议阅读顺序
这组概念的关系
- js对象 解释对象和属性访问
- js原型和原型链 解释属性如何沿原型链查找与共享
- js构造函数 解释如何批量创建对象
- js-new 解释实例如何接到构造函数的
prototype - proto-prototype-constructor 单独拆清三个常混淆名词
- js-class 说明
class是原型机制的语法层
一句话结论
JavaScript 属性继承基于原型链;class 还引入构造限制、严格模式与私有元素等语义,见 js-prototype-not-class。
面试要点
一句话回答
原型链是对象属性查找时沿原型逐级向上查找的机制,而 new 的核心作用是创建实例对象,并把实例连接到构造函数的 prototype 上。
回答原型链时最稳的说法
- 对象访问属性时,先看自己有没有
- 没有就沿着内部原型继续往上找
- 找到属性就停止,否则直到 null;Object.create(null) 等对象不经过 Object.prototype
回答 new 时最稳的说法
普通构造函数的常见路径可以按步骤讲(派生类另有 super 规则):
- 创建一个新对象
- 若构造函数的 prototype 是对象,用它作新对象的原型;否则回退到相应内建原型
- 用新对象作为
this执行构造函数 - 返回这个对象(除非构造函数显式返回对象)
面试里的常见误区
把 __proto__ 当成原型本身
proto 是 Object.prototype 上的历史访问器,可能被遮蔽或根本不存在;内部链接用 [[Prototype]] 表示,读取优先用 Object.getPrototypeOf。
把 class 当成完全不同的对象模型
class 仍使用原型继承,但不是任意构造函数写法的逐字替换;应同时理解 class 自身的语义约束。
最短记忆方式
原型链解决“属性怎么找”,new 解决“实例怎么接到原型上”。