首页 > 其他分享 >【待做】【前端开发系列】 class 类的私有属性

【待做】【前端开发系列】 class 类的私有属性

时间:2024-08-11 21:51:43浏览次数:3  
标签:obj 私有 class getX console 前端开发 属性

https://mp.weixin.qq.com/s/f-ShUeDXUQlQIwVCrAVgSA
class 类的私有属性
前端工作室 前端精髓 2024年08月11日 10:51 北京

图片

私有属性是常规的类的公有属性(包括类字段、类方法等)的对应。私有属性通过添加 # 前缀来创建,在类的外部无法合法地引用。这些类属性的私有封装由 JavaScript 本身强制执行。

在这种语法出现之前,JavaScript 语言本身并没有原生支持私有属性。在原型继承中,可以通过使用 WeakMap 对象或者闭包的方式来模拟私有属性的行为,但就易用性而言,它们无法与 # 语法相提并论。

class ClassWithPrivate {
// 私有实例字段

privateField;

privateFieldWithInitializer = 42;

// 私有实例方法

privateMethod() {

// …

}
// 私有静态字段
static #privateStaticField;
static #privateStaticFieldWithInitializer = 42;
// 私有静态方法
static #privateStaticMethod() {
// …
}
}

还有一些额外的语法限制:

1.类中所有声明的私有标识符都必须是唯一的,并且命名空间在静态属性和实例属性之间是共享的。唯一的例外是:两个声明定义了 getter-setter 对。2.私有描述符不能是 #constructor。

大多数类属性都有其对应的私有项:

1.私有字段2.私有方法3.私有静态字段4.私有静态方法5.私有 getter6.私有 setter7.私有静态 getter8.私有静态 setter

这些特性统称为私有属性。然而,JavaScript 中构造函数不能是私有的。为了防止在类之外构造类,你必须使用私有标志。

私有属性通过“#名称”(“#”读作“hash”)来声明,它们是以 # 前缀开头的标识符。这个 # 前缀是属性名称的固有部分,你可以将其与旧的下划线前缀约定 _privateField 进行类比,但它不是普通的字符串属性,因此无法使用方括号表示法动态访问它。

在类外部引用 # 名称、引用未在类内部声明的私有属性,或尝试使用 delete 移除声明的属性都会抛出语法错误。

class ClassWithPrivateField {

privateField;

constructor() {;
delete this.#privateField; // Syntax error
this.#undeclaredField = 42; // Syntax error
}
}

const instance = new ClassWithPrivateField();
instance.#privateField; // Syntax error

JavaScript 作为动态语言,能够在编译时检查 # 标识符的语法,使其与普通属性的语法不同。

备注:Chrome 控制台中运行的代码可以访问类的私有属性。这是 JavaScript 语法限制对开发者工具的一种放宽。

如果你访问对象中不存在的私有属性,会抛出 TypeError 错误,而不是像普通属性一样返回 undefined。

class C {

x;

static getX(obj) {
return obj.#x;
}
}

console.log(C.getX(new C())); // undefined
console.log(C.getX({})); // TypeError: Cannot read private member #x from an object whose class did not declare it

这个示例也演示了你可以在静态函数中以及在外部定义的类的实例上访问私有属性。

你也可以使用 in 运算符来检查一个外部定义的对象是否拥有一个私有属性。如果对应的私有字段或私有方法存在,则返回 true,否则返回 false。

class C {

x;

constructor(x) {
this.#x = x;
}
static getX(obj) {
if (#x in obj) return obj.#x;

return "obj 必须是 C 的实例";

}
}
console.log(C.getX(new C("foo"))); // "foo"
console.log(C.getX(new C(0.196))); // 0.196
console.log(C.getX(new C(new Date()))); // 当前的日期和时间
console.log(C.getX({})); // "obj 必须是 C 的实例"

请注意,私有名称始终需要提前声明并且不可删除:如果你发现一个对象具有当前类的一个私有属性(无论是通过 try...catch 还是 in 检查),那么它一定具有其他所有的私有属性。通常情况下,一个对象具有一个类的私有属性意味着它是由该类构造的(尽管并非总是如此)。

私有属性不是原型继承模型的一部分,因为它们只能在当前类内部被访问,而且不能被子类继承。不同类的私有属性名称之间没有任何交互。它们是附加在每个实例上的外部元数据,由类本身管理。因此,Object.freeze() 和 Object.seal() 对私有属性没有影响。

微信扫一扫
关注该公众号

标签:obj,私有,class,getX,console,前端开发,属性
From: https://www.cnblogs.com/o-O-oO/p/18353716

相关文章

  • 搭建python私有仓库
    1.创建帐号密码文件,并添加内容touch/opt/pyserver/.htpasswdecho"username:password">/opt/pyserver/.htpasswd2.创建包路径mkdir/opt/pyserver/packages3.创建私有仓库#不带转发的命令dockerrun--namepypi--restartalways-v/opt/pyserver/packages:/d......
  • 012.Vue3入门,class属性的几种绑定方法
    1、代码如下:<template><h3>class绑定</h3><div:class="{'active':isActive,'text-danger':hasError}">Class样式绑定1</div><div:class="classObject">Class样式绑定2</div><div......
  • 已解决:java.lang.UnsupportedClassVersionError 异常的正确解决方法,亲测有效!!!
    java.lang.UnsupportedClassVersionError是一个常见的错误,通常出现在运行一个Java程序时,提示某个类的版本与当前JVM(JavaVirtualMachine)不兼容。这通常意味着你试图在一个较低版本的JVM上运行由较高版本的Java编译器编译的类文件。本文将详细分析该错误的成因,并提供有效的解......
  • Web前端开发环境搭建
    安装node.js和npm上官网下载:https://nodejs.org/zh-cn不管macOS还是Windows,下载的都是安装程序,按提示完成即可。安装前的提示如下:Thispackagewillinstall: • Node.jsv20.16.0to/usr/local/bin/node • npmv10.8.1to/usr/local/bin/npm安装成功后,可看到如......
  • JS中【class】知识点详解
    JavaScript中的class是一种语法糖,用于简化创建和管理对象的原型链和继承。虽然JavaScript的核心依然是基于原型继承的,但class语法让面向对象编程风格更加直观和易于使用。1.定义类使用class关键字可以定义一个类。类通常包含构造函数和方法。classPerson{......
  • PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
    Abstract通常情况下研究人员会把点云数据转换为规则的3D体素网格或图像集合。这导致数据不必要的庞大,所以本文引入了一种新型的神经网络,能很好的尊重点云的排列不变性,名称是pointnet,并且能够应用于分类、分割、场景解析等下游任务。同时,网络的架构简单而且非常的高效。Intro......
  • 配置 Containerd 在 harbor 私有仓库拉取镜像
    unexpectedstatuscode[manifests1.28]:401Unauthorized【问题描述】下载Harbor中的私有镜像时报错:[root@lidabaiapp]#ctr-nharbor.lidabaiimagespull192.168.2.22:443/lidabai/busybox:1.28-kctr:failedtoresolvereference"192.168.2.22:443/lidabai/busyb......
  • 轮换挑选图片,补充 es6的对象写法,uniapp使用,class和style,条件渲染,列表渲染,input
    Ⅰ轮换挑选图片【一】方式一<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scriptsrc="./js2/vue.js"></script></head><body>......
  • 解决Spring报错:Failed to read candidate component class: file [ ]; nested exceptio
    使用IDEA建立一个很基础的Spring项目时,之前用xml方式,写bean标签一直正常使用,改用注解方式后发现报错,显示:Exceptioninthread"XXX"org.springframework.beans.factory.BeanDefinitionStoreException:Failedtoreadcandidatecomponentclass:file[XXX.class];nestedexc......
  • harbor私有镜像仓库高可用部署
    Harbor介绍harbor是一个docker私有镜像仓库,虽然docker官方提供了公共的镜像仓库(DockerHub),但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的DockerRegistry管理项目。Harbor的优势:图形管理界面。按项目管理镜像。独......