JavaScript私有属性方法的三种实现过程

本文介绍了如何在JavaScript中实现私有属性和方法,从ES5的闭包到ES6的Symbol和WeakMap。通过示例代码详细解释了不同方法的实现原理和优缺点,帮助开发者理解私有化概念在JavaScript中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家可能知道ES11已经从官方规范上实现了“私有”的概念,不管是私有属性还是私有方法都只需要在前面加上“#“即可,但是ES11版本太新,担心可能很多浏览器不能很好的支持,并不是所有用户都会使用Chrome,对吧? 所以这一次我们从ES5开始到ES6实现私有化的概念

一、ES5闭包

'use strict'
//第一种
const Test=function(){
  //定义私有属性
  let privateAttr; 


  function Test(id){  
      privateAttr="我是私有属性"
      this.publicAttr="我是对象公有属性";
      privateFun=privateFun.bind(this); //改变私有方法this指向
  }


  //私有方法
  function privateFun(){
    console.log(privateAttr); //访问私有变量
    console.log(this.publicAttr); //访问对象属性
  }

  return Test;

}();


const t=new Test();
console.log(t.publicAttr); //我是对象公有属性
console.log(t.privateAttr); //undefined
console.log(t.privateFun); //undefined

看到这,如果你就是想访问publicAttr的值,不妨在Test原型上添加一个”特权方法“,将私有变量的值返回出去即可。

二、ES6 Symbol

'use strict'
const Test=function(){
  const privateAttr = Symbol('private');
  const privateFun = Symbol('private');
  function Test(){
    this[privateAttr]=9;
    this.attr=1;
    this[privateFun](); //调用私有方法
  }

  Test.prototype.add=function(){
    this[privateAttr]=this[privateAttr]+1;
    console.log(`私有属性+1得到的结果${this[privateAttr]}`);

    this.attr=this.attr+1;
    console.log(`对象属性+1得到的结果${this.attr}`);
  }

  Test.prototype[privateFun]=function(){
    console.log("这里是私有方法");
    console.log(`私有属性是${this[privateAttr]}`);
  }
  
  return Test;
}();

const t=new Test();  //这里是私有方法  私有属性是9
t.add();  //私有属性+1得到的结果10 对象属性+1得到的结果2

privateAttr privateFun 的值都是 Symbol('private'),但是他们内部得到的引用不一样,这就是Symbol的好处,使用Symbol 使得私有方法也能在原型上定义,避免了不必要的this指向问题,这个方法优于上面的方法

三、ES6 WeakMap和Symbol

'use strict'
const Test=function(){
  const wm=new WeakMap();

  function Test(){
    this.attr="对象属性";

    this.privateAttr=Symbol('private');
    this.privateFun=Symbol('private');
    const privateMem=wm.get(this) || {};
    privateMem[this.privateAttr]="private Attribute";
    privateMem[this.privateFun]=privateFun.bind(this);
    wm.set(this,privateMem);
  }

  function privateFun(){
    wm.get(this)[this.privateAttr]="new private Attribute";
    console.log(`改变后私有变量的值是 ${wm.get(this)[this.privateAttr]}`);
    console.log(`对象属性 ${this.attr}`);
  }

  Test.prototype.show=function(){
    console.log(`私有属性的值: ${wm.get(this)[this.privateAttr]}`);
    
    wm.get(this)[this.privateFun](); //调用私有方法
  }
  return Test;
}();

const t=new Test();
t.show();

//私有属性的值: private Attribute
//改变后私有变量的值是 new private Attribute
//对象属性 对象属性

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值