原型对象支持链式调用的关键是每个方法末尾显式返回this,确保后续方法能在同一实例上连续调用;只读方法不返回this,修改状态的方法必须返回this;构造函数需预先初始化属性,方法应统一定义在prototype上。

原型对象支持链式调用,关键在于每个方法执行完操作后返回 this —— 即当前实例本身。这样后续方法就能继续在同一个对象上被调用,形成 .method1().method2().method3() 的流畅风格。
原型方法必须显式返回 this
在原型(prototype)上定义的方法,默认不返回任何值(即返回 undefined),一旦某个方法返回了 undefined,链条就中断了。因此,所有参与链式调用的方法末尾都必须写 return this;。
- 只读类方法(如
getValue()、toString())通常不返回this,因为它们是链的终点 - 修改状态或配置类的方法(如
setStyle()、addValue()、show())必须返回this - 即使方法内部只做简单赋值,也要加
return this;,不能省略
构造函数要正确初始化实例属性
链式调用依赖于实例持续存在且状态可累积。因此,构造函数需预先设置好必要的属性,避免方法执行时访问 undefined 导致报错。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如 DOM 工具类:
this.elements = [];在构造时初始化数组,后续each()、setStyle()才能安全遍历 - 数值计算类:
this.value = 0;或接受初始值,保证add()、multiply()有明确操作目标 - 不要把初始化逻辑推迟到第一个方法里,否则首次调用前实例状态不完整
注意原型链不影响链式行为,但影响方法查找
链式调用本身不依赖原型链的“继承”特性,而是靠每次调用后仍持有同一实例引用。但原型链决定了哪些方法能被找到:
- 方法定义在
Constructor.prototype上,实例才能通过原型链访问到它 - 如果误把方法写在构造函数内部(如
this.method = function(){...}),虽也能返回this,但每次新建实例都会重复创建函数,浪费内存 - 推荐统一使用
Constructor.prototype.xxx = function(){...; return this;}的方式定义可链式方法
典型 jQuery 风格实现示意
这是原型支持链式的经典模式,也是实际项目中最常复用的结构:
function $(selector) {
return new _$(selector);
}
function _$(selector) {
this.elements = typeof selector === 'string'
? Array.from(document.querySelectorAll(selector))
: Array.isArray(selector) ? selector : [selector];
}
_$.prototype.each = function(fn) {
this.elements.forEach((el, i) => fn.call(this, el, i));
return this; // ✅ 支持继续链
};
_$.prototype.css = function(prop, val) {
this.each(el => el.style[prop] = val);
return this; // ✅ 支持继续链
};
_$.prototype.on = function(type, handler) {
this.each(el => el.addEventListener(type, handler));
return this; // ✅ 支持继续链
};
// 使用:$('.btn').css('color', 'red').on('click', fn);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










