如何访问ES6类构造函数中的私有局部变量?
在ES6类中访问构造函数内的局部私有变量
咱们先拆解下你遇到的核心问题:你在ES6类的构造函数里声明了let boy = "Bobby"这类局部变量,还有一个语法无效的girl: "Marry"(这是个标签语句,根本不会给实例或类添加属性)。这类局部变量只会存在于构造函数的作用域内,不会挂载到实例、类原型或者类本身,所以外部没法直接访问——这和传统构造函数里靠闭包访问局部变量的逻辑看起来不一样,但其实咱们可以用相似的思路在ES6类里实现。
为什么传统构造函数能访问?
在传统构造函数中,你通过this.getBoy = function() {}定义了实例方法,这个方法会形成闭包,捕获构造函数作用域里的boy变量,所以实例调用getBoy时就能访问到这个局部变量,这是闭包的特性。
ES6类里的两种解决方案
方案1:沿用闭包思路(和传统构造函数逻辑一致)
在类的构造函数内定义实例方法,让方法捕获构造函数作用域里的局部变量,实现私有访问:
class Forrest { constructor() { let boy = "Bobby"; // 修正girl的写法,若要挂载到实例需用this.girl this.girl = "Marry"; // 定义实例方法,通过闭包访问boy this.getBoy = function() { console.log(boy); }; // 也可以添加修改方法 this.setBoy = function(newName) { boy = newName; }; } } const f = new Forrest(); f.getBoy(); // 输出 Bobby f.setBoy("Tom"); f.getBoy(); // 输出 Tom
这种方式下boy完全是构造函数作用域内的私有变量,外部无法直接修改,只能通过你暴露的方法操作,真正实现了私有性。
方案2:使用ES6+私有字段(更贴合类语法风格)
如果你想更符合类的语法规范,可以用ES6之后支持的私有字段(前缀加#),这类字段是类的私有成员,仅能在类内部访问:
class Forrest { // 提前声明私有字段 #boy; constructor() { this.#boy = "Bobby"; this.girl = "Marry"; } getBoy() { console.log(this.#boy); } setBoy(newName) { this.#boy = newName; } } const f = new Forrest(); f.getBoy(); // 输出 Bobby // f.#boy; // 直接访问会抛出语法错误,私有字段禁止外部访问 f.setBoy("Jerry"); f.getBoy(); // 输出 Jerry
这种方式的优势是语法更规范,私有字段是类的正式成员,而非依赖闭包的局部变量,目前主流浏览器和Node.js都已支持该特性。
补充说明
你原代码里的girl: "Marry"是一个标签语句,不属于变量赋值逻辑,不会给实例或任何对象添加属性。如果想让girl成为实例的可访问属性,需要写成this.girl = "Marry"。
内容的提问来源于stack exchange,提问作者Maksym Dudyk
相关产品推荐
相关产品推荐

