JavaScript 封装问题
这篇讲的是一个在 JavaScript 面向对象编程中,开发者容易踩到的具体“坑”。作者从百度知道的一个提问出发,发现不少开发者在使用构造函数和原型(prototype)封装类时,会习惯性地在函数内部给 prototype 赋值,从而导致实例化后调用原型方法时报错“XX is not a function”。 文章通过代码重现了这个问题,并深入分析了根因:JavaScript 引擎在执行 `new` 操作符时,会先基于构造函数内部的 `this` 创建一个新对象,然后才执行构造函数体内的代码。这意味着,当我们在函数内部书写 `Dialog.prototype = {...}` 这行代码时,其实是在函数执行期间动态替换了原型对象。然而,当前这个实例在创建时,其内部的 `[[Prototype]]` 指向的还是旧的、空的原型对象。因此,实例无法访问到新定义的原型方法。 正确的封装做法,是将原型的定义放在构造函数的外部、紧随其后的代码中。这样可以确保在创建任何实例之前,原型方法就已经稳定地定义好了。这个案例提醒我们,理解 JavaScript 原型链的绑定时机至关重要,一个简单的代码顺序差异,就会导致截然不同的运行结果。