zoukankan      html  css  js  c++  java
  • 【JavaScript】Class 关键字创建类时如何使用私有变量

    最近碰上这个问题,查了很多资料

    在以往版本创建类时,我们可以轻松地使用私有变量及方法
    例如:

    function Constructor(param){
        var that = this;
        var private = //..
        this.public = //..
        
        this.method = function () {
            console.log(private);
            console.log(this.public);
        }
    }
    

    因为整个构造函数在一个作用域内,于是我们就可以在任意一个方法中访问到外部作用域的私有成员。

    但是使用 class 关键字创建类时,构造函数和方法是分开的,而且在 class 中直接写代码也是不符合语法的,所以使用私有成员就是一件很难办到事情。
    换言之,class 中的构造函数和方法的直接外部作用域就是 class 的直接外部作用域,如果在全局,那就是全局作用域,作为一个 class ,总不能让他依赖外部的作用域吧?

    查资料的过程中发现很多人都在用这种方法

    我随便贴两张:
    在这里插入图片描述
    在这里插入图片描述
    它们的思路是,在 class 外部再包一层 function,然后将 class 作为闭包传递出来,这样 class 访问的直接外部作用域就是闭合的了。

    我就很不理解,为什么这么多人都在说这种方法,他可是有一个很大的缺陷的:class 的外部作用域唯一,即多个实例间会公用一套私有变量。

    但是我总是对自己不够自信,以为是一些神奇的机制,而我并不了解这些机制。
    于是我动手试了试,发现多个实例间的确会冲突。。

    我思来想去,这个思路唯一可行的办法就是,每次实例化对象时必须重新创造一个外部作用域
    代码:

     function Constructor(param) {
         var that = this;
         var privateVar = //..
         var privateFun = function () {
             console.log(that);
         }
         return new class {
             constructor() {
                 this.public = param;
             }
    
             method(){
                 console.log(private);
                 console.log(this.public);
             }
         }();
     }
    

    这样虽然可以解决问题,但是构建的复杂性就高了许多,而且每次实例化对象时实际上是通过一个新类来实例化的,总有占了小便宜吃大亏的感觉。

    目前还没有什么好的办法,如果解决了我会回来更新,如果有大佬知道如何做到这一点,请不吝赐教。


    惭愧,刚知道在新标准中已经存在私有成员的概念了,而且主流浏览器也都基本实现了

    class {
    	#private = //..
    	constructor() {
    	     this.public = param;
    	 }
    	 method(){
    	     console.log(this.#private);
    	     console.log(this.public);
    	 }
    }
    
  • 相关阅读:
    第一阶段冲刺第三天
    C语言printf函数求值顺序
    计算文件的MD5值
    SWFUpload后台取数据
    swfupload的使用方式
    文件上传的几种方式
    自定义缓存
    发邮件
    生成验证码
    将序列化成json格式后日期(毫秒数)转成日期格式
  • 原文地址:https://www.cnblogs.com/gaolihai/p/13149754.html
Copyright © 2011-2022 走看看