我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

JavaScript的高级语法的发展总是落后其它的高级编程语言,比如:javascript中的类的写法就曾经是个很大的难题。直到es6标准的出现,这种情况才得到好转。本文将讲述目前的浏览器及node都支持的class中的私有属性的写法。

苏南大叔:JavaScript,class类如何通过关键字#定义私有属性? - class私有属性
JavaScript,class类如何通过关键字#定义私有属性?(图4-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验感悟。本文测试环境:win10chrome@116.0.5845.141node@16.14.2。本文涉及的是:JavaScriptclass中的私有属性的写法。

传统的私有属性写法"_prop"

以前的时候,大家都是在属性名称前加一个下划线“_”,表示这个属性是个非公有的属性。但这是个掩耳盗铃的写法,其本质上还是个大家都可以访问的属性。

var su = {
  name: "对象普通键",
  _name: "对象假私有键",
};
class nan {
  name = "类普通属性";
  _name = "类虚假私有属性";
}
nan = new nan();
console.log(su.name, su["name"], su._name, su["_name"]);
console.log(nan.name, nan["name"], nan._name, nan["_name"]);

输出:

对象普通键 对象普通键 对象假私有键 对象假私有键
类普通属性 类普通属性 类虚假私有属性 类虚假私有属性

苏南大叔:JavaScript,class类如何通过关键字#定义私有属性? - 类私有属性代码一
JavaScript,class类如何通过关键字#定义私有属性?(图4-2)

es6最新标准私有属性写法"#prop"

普通的object对象,是不可以定义以#开头的键的。所以,这种情况放弃讨论。

var su = {
  _name: "对象假私有键",
  // #name:"对象真私有键",   // Uncaught SyntaxError: Unexpected identifier '#name'
};

js中的类class可以定义#开头的私有属性。测试代码:

class nan {
  #name = "类真实私有属性";
}
nan = new nan();
console.log(nan["#name"]);    // undefined
// console.log(nan.#name);    // Uncaught SyntaxError: Private field '#name' must be declared in an enclosing class

苏南大叔:JavaScript,class类如何通过关键字#定义私有属性? - 类私有属性代码二
JavaScript,class类如何通过关键字#定义私有属性?(图4-3)

对于私有属性来说:

  • ["#prop"]的写法,拿到的值是undefined
  • .#prop的写法,直接报错Private field '#name' must be declared in an enclosing class
typescript里面,class是有private关键字的。这个后续文章待续。

类内部可以公开私有属性

在类的内部,是可以通过this.#prop读取到私有属性的。如果在这种读取私有属性的办法,包装在一个getter里面的话,就和一个可变成的普通属性没有啥区别了。测试代码:

class nan {
  #name = "类真实私有属性";
  get name() {
    console.log("只有类自身内部的方法能访问");
    return this.#name;
  }
}
nan = new nan();
console.log(nan["name"],nan.name);    // 类真实私有属性 类真实私有属性

输出:

只有类自身内部的方法能访问
只有类自身内部的方法能访问
类真实私有属性 类真实私有属性

苏南大叔:JavaScript,class类如何通过关键字#定义私有属性? - 类私有属性代码三
JavaScript,class类如何通过关键字#定义私有属性?(图4-4)

相关文章

结束语

更多nodejs的经验文章,可以参考苏南大叔的经验文章:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   js