如何在JavaScript中将构造函数参数赋值给同名私有变量
JavaScript类中实现私有成员的正确方式
你当前的写法存在两个问题:
- 类外部的
let mapInstance是模块级变量,不属于类的私有成员,和类实例完全无关; this.mapInstance = mapInstance是给实例挂载公共属性,外部可以直接访问,并非私有变量,VSCode提示未使用要么是你后续没用到这个属性,要么是你混淆了私有变量的定义方式。
要实现类似Java中类私有变量的效果,目前JavaScript有两种主流方案:
1. ES6标准私有字段(推荐)
用#前缀定义私有字段,这是官方标准的私有成员实现,只能在类内部访问,外部无法读取或修改,和Java私有变量行为一致:
// 移除类外部的全局变量,不需要了 export class DigitizePolygonInteractions extends MapBuilder { #mapInstance; // 定义类私有字段 #instance; // 如果需要保存实例引用,也改成私有字段 /** * @param { string } moduleName like 'map-sen2bee' */ constructor(moduleName, mapInstance) { super(moduleName); this.#instance = this; this.#mapInstance = mapInstance; // 赋值给私有字段 } // 类内部方法可以正常访问私有字段 exampleMethod() { console.log(this.#mapInstance); } }
2. 闭包模拟私有成员(兼容旧环境)
如果你的运行环境不支持ES6私有字段,可以用闭包实现,利用函数作用域隔离变量:
export class DigitizePolygonInteractions extends MapBuilder { constructor(moduleName, mapInstance) { super(moduleName); // 这里的mapInstance是构造函数内的变量,只有类内部方法能访问 const privateMapInstance = mapInstance; const instance = this; // 类方法要访问私有变量,需要用箭头函数(绑定this)或者在构造函数内定义 this.exampleMethod = () => { console.log(privateMapInstance); }; } }
注意:闭包方式的私有变量是实例级的,每个实例有独立的私有变量,但这种写法会让每个实例都创建一份方法副本,性能略差,优先推荐第一种标准写法。
内容的提问来源于stack exchange,提问作者Amrmsmb
相关产品推荐
相关产品推荐

