类方法通过原型链查找而非复制给实例;必须定义在prototype上才能共享,构造函数内定义则浪费内存;class是语法糖,静态方法不进原型链;链式调用需方法返回this。

类方法能被实例调用,靠的是原型链的属性查找机制——不是方法“复制”给了实例,而是实例在自身找不到时,自动沿着 __proto__ 一路向上找,最终在原型对象上命中。
方法必须定义在 prototype 上
只有挂载到构造函数(或 class)的 prototype 属性上的方法,才会进入原型链,被所有实例共享。直接写在构造函数内部的,属于实例私有,每次新建都会重复创建。
-
正确写法(共享、省内存):
Person.prototype.say = function() { console.log(this.name); }; -
错误写法(不共享、浪费内存):
function Person(name) { this.say = function() { console.log(name); }; }
实例调用时的查找过程
当你执行 alice.say(),JavaScript 引擎按顺序检查:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 先看
alice自身有没有say属性(没有) - 再查
alice.__proto__(即Person.prototype),找到了say方法 - 执行时,
this指向alice,所以能访问alice.name
class 语法下的等价实现
ES6 的 class 只是语法糖,底层仍是原型机制:
-
class Person { say() { console.log(this.name); } }等价于把say添加到Person.prototype -
new Person('Tom')创建的实例,其__proto__仍指向Person.prototype - 静态方法(
static)则挂在构造函数本身,不进原型链,实例无法直接调用
链式调用依赖返回 this
要支持 obj.method1().method2(),每个方法需显式返回 this,让下一次调用仍作用于同一实例:
Person.prototype.setName = function(name) { this.name = name; return this; };- 这样
alice.setName('Alice').say()才能成立
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










