JavaScript的面向对象基于原型链而非class,class只是语法糖;new操作使实例__proto__指向构造函数prototype,方法挂载其上即可共享;prototype是函数属性,__proto__是对象内部属性,二者有固定映射关系;class和继承本质仍是原型链运作。

JavaScript 的面向对象编程不是靠 class 关键字“实现”的,而是靠原型链“运作”的;class 只是语法糖,底层全靠 __proto__、prototype 和 constructor 三者联动。
为什么 new 一个对象后能访问到方法?
因为 new 操作会自动把实例的 __proto__ 指向构造函数的 prototype。只要方法挂在构造函数的 prototype 上,所有实例就能共享访问。
function Person(name) { this.name = name; }Person.prototype.say = function() { return 'Hi ' + this.name; };-
const p = new Person('Alice');→p.__proto__ === Person.prototype为true - 调用
p.say()时,JS 引擎顺着p.__proto__ → Person.prototype → say找到方法
prototype 和 __proto__ 到底谁指向谁?
prototype 是函数才有的属性,用于定义“将来被 new 出来的实例”的原型;__proto__ 是每个对象(包括函数)都有的内部属性,指向它“从哪来”。二者不能混用,但有固定映射关系:
- 函数的
__proto__指向Function.prototype(因为函数也是 Function 的实例) - 函数的
prototype默认是一个空对象,其constructor指回该函数 - 实例的
__proto__指向构造函数的prototype -
Object.prototype.__proto__是null,这是原型链终点
class 语法下原型链还存在吗?
完全存在,且规则没变——只是写法更紧凑。class 声明本质就是函数声明加自动绑定 prototype。
这本书给出了一份关于python这门优美语言的精要的参考。作者通过一个完整而清晰的入门指引将你带入python的乐园,随后在语法、类型和对象、运算符与表达式、控制流函数与函数编程、类及面向对象编程、模块和包、输入输出、执行环境等多方面给出了详尽的讲解。如果你想加入 python的世界,David M beazley的这本书可不要错过哦。 (封面是最新英文版的,中文版貌似只译到第二版)
立即学习“Java免费学习笔记(深入)”;
class Cat { constructor(name) { this.name = name; } meow() { return 'meow'; } }- 等价于:
Cat是函数,Cat.prototype.meow就是那个方法 -
const c = new Cat('Tom');→c.__proto__ === Cat.prototype - 继承:
class Lion extends Cat会让Lion.prototype.__proto__ === Cat.prototype,同时Lion.__proto__ === Cat
容易踩的坑:直接修改 prototype vs Object.setPrototypeOf
运行时改原型会影响所有已有和未来实例,但方式不同、性能也不同:
- 给
MyClass.prototype.xxx = ...是安全且推荐的扩展方式 -
Object.setPrototypeOf(obj, newProto)会破坏 V8 的内联缓存,大幅降低后续属性访问速度 -
obj.__proto__ = ...是非标准写法,部分环境不支持,且同样影响优化 - 想临时借用方法?用
func.call(obj, ...)或func.apply(obj, [...]),别动原型
原型链不是抽象概念,它是 JS 引擎每次读取属性时真实走的一条指针路径。理解它,关键不是记住图示,而是看清 __proto__ 指向哪里、prototype 被谁用、以及 constructor 是否被意外覆盖——这三个点一错,继承就悄无声息地断掉。










