美文网首页
Class中的私有属性

Class中的私有属性

作者: no_code_no_life | 来源:发表于2020-01-18 18:09 被阅读0次

私有属性

私有属性是面向对象编程(OOP)中非常常见的一个特性,满足以下特点:

  • 能被 class 内部的不同方法访问,但不能在类外部被访问
  • 子类不能继承父类的私有属性

新的提案

在 class 中,用 '#' 开头的属性代表私有属性(该提案已经到Stage 3)

class Foo {
  #a; // 私有属性
  constructor(a, b) {
    this.#a = a;  
    this.b = b;
  }
}

注:上面私有属性的声明,需要先经过Babel等编译器编译后才能正常使用

JS模拟实现私有属性

  1. 约定俗成
    变量前加下划线 '_' 前缀代表私有属性,实际还是公共属性
  2. 闭包
    在 constructor 作用域内定义局部变量,内部通过闭包的方式对外暴露
class Foo {
  constructor(a, b, c) {
    this.a = a;
    this.b = b;

    let _c = c;
    this.getC = function() {
      return _c;
    }
    this.setC = function(val) {
      _c = val;
    }
  }
}

const foo1 = new Foo('a1', 'b1', 'c1');
console.log(foo1.a, foo1._c, foo1.getC()); // a1 undefined c1
foo1.setC('c2')
console.log(foo1.getC()); // c2
  1. Symbols & Getter
    利用 Symbol 变量可以作为对象 key 的特点,可以模拟实现私有属性
const FoolSymbol = (() => {
  const _p = Symbol('p');
  class FoolSymbol {
    constructor(a, b, p) {
      this.a = a;
      this.b = b;
      this[_p] = p;
    }
    getP = (val) => {
      return this[_p];
    }
    setP = (val) => {
      this[_p] = val;
    }
  }
  return FoolSymbol;
})();

const foolSymbol = new FoolSymbol('a1', 'b1', 'p1');
console.log(foolSymbol.getP()); // p1
foolSymbol.setP('p2');
console.log(foolSymbol.getP()); // p2

对比:第二种利用闭包的方式,该属性的get 和 set 方法只能在 Class 的 constructor 内部,外部访问不到该属性,而 Symbol 可以在外部获取到,所以get 和 set 方法可以写在 constructor 外部

相关文章

  • Class中的私有属性

    私有属性 私有属性是面向对象编程(OOP)中非常常见的一个特性,满足以下特点: 能被 class 内部的不同方法访...

  • 面向对象一私有属性

    class Person(object): 在对象中,提供set/get方法,来间接的访问对象的私有属性 给私有属...

  • es6 class实现静态属性、私有属性、方法

    1.class实现静态属性 参考:ES6 class 静态属性和私有方法 es6中实现了静态方法,但是没有静态属性...

  • html中有哪些属性,各自的特点是什么

    在html中,属性分为公有(全局)属性和私有属性 公有(全局)属性指所有元素都可以拥有的属性包括:id、class...

  • Python 之路06 - 面向对象

    本节大纲: 特性:class、object 封装 继承 多态语法\属性\方法构造函数\析构函数私有方法\私有属性类...

  • Python高级语法5:私有属性、魔法属性、with与上下文管理

    一、私有属性 我们大家知道在类里面定义的属性名前加两个下划线就是私有属性,它是不能在外面被访问的,如下:class...

  • class私有属性 Symbol 模拟

    js中不支持private关键字私有属性,但是在实际项目中可能有这种需求,因此我们可以利用es6的一些特性来比较完...

  • python 私有属性

    私有属性 python 中类里面定义的变量叫做类属性,类属性有两种公有属性和私有属性 属性的定义: 私有: 以单下...

  • Class 的基本语法

    简介 严格模式 constructor 方法 类的实例对象 Class 表达式 不存在变量提升 私有方法和私有属性...

  • 类和对象

    私有属性:属性名以两个下划线开头 假的私有属性 //实际开发中,声明类的属性,很少会使用真正的私有属性和公开属性(...

网友评论

      本文标题:Class中的私有属性

      本文链接:https://www.haomeiwen.com/subject/lcgczctx.html