你有没有想过,写代码和做菜其实挺像的?比如在厨房里切菜,每个人都有自己的习惯动作——有人喜欢先切片再切丝,有人直接上手拍蒜。这就像程序里的“对象实例方法调用”,每个“厨师”(也就是对象实例)都能用自己的方式执行同一个动作。
从炒菜锅说起
假设我们有个“锅”类,它有一个方法叫“翻炒”。但每口锅的实际操作可能不一样。不锈钢锅要轻点翻,不粘锅可以大胆颠勺。这时候,我们就得靠“对象实例”来调用各自的方法。
class Pan {
constructor(type) {
this.type = type; // 比如 "不粘锅", "铁锅"
}
stirFry() {
if (this.type === "铁锅") {
console.log("大火快炒,猛火颠勺!");
} else if (this.type === "不粘锅") {
console.log("中小火慢慢翻,别划伤涂层。");
}
}
}
// 实例化两个不同的锅
const ironPan = new Pan("铁锅");
const nonStickPan = new Pan("不粘锅");
// 调用各自的实例方法
ironPan.stirFry(); // 输出:大火快炒,猛火颠勺!
nonStickPan.stirFry(); // 输出:中小火慢慢翻,别划伤涂层。
你看,虽然都是“翻炒”,但具体怎么动,得看是哪个锅在干活。这就是对象实例方法调用的核心——方法的行为取决于实例本身的状态。
家常菜中的“this”指向
在上面的例子中,this 指向的是当前使用的那口锅。就像你在厨房里说“我来翻一下”,这个“我”就是当前的操作者。JavaScript 里的 this 也一样,谁调用,就指向谁。
如果你把 stirFry 方法拿出来单独执行,那就乱套了——好比让一个没拿锅的人喊“我来翻炒”,结果啥也没翻成。所以方法必须通过实例来调用,才能正确关联上下文。
多个厨师协作也不慌
家里来客人,爸妈一起做饭。爸爸用铁锅爆炒,妈妈用不粘锅煎鱼。两人各司其职,互不干扰。程序里也是这样:
const dadPan = new Pan("铁锅");
const momPan = new Pan("不粘锅");
dadPan.stirFry(); // 爸爸的操作
momPan.stirFry(); // 妈妈的操作
两个实例各自调用自己的方法,数据隔离,互不影响。这种设计让代码像厨房分工一样清晰。
下次写代码时,不妨想想你在厨房里的样子。每个对象就像一个会干活的厨具,方法就是它的动作。只要实例一出手,动作自然对路子。