私人品牌检查A.K.a.` #foo在obj`中

2021-04-15 22:09:03

在操作员中可以用于测试给定的对象(或其原型链中的任何对象)是否具有给定的属性:Const O1 = {' foo' :0};安慰 。日志(' foo'在O1); // true const o2 = {};安慰 。日志(' foo'在O2); // false const o3 =对象。创造(o1);安慰 。日志(' foo'在O3); // 真的

私有品牌检查功能扩展了IN运营商以支持私有类字段:类{静态测试(obj){控制台。日志(在obj中#foo); #foo = 0; } 一种 。测试(新()); //真实a。测试 ( { } ) ; // false class {#foo = 0; } 一种 。测试(新()); // 错误的;它' s不是相同的#foo

由于私有名称仅在定义它们的类内可用,因此在类内也必须发生测试,例如在上面的静态测试等方法中。子类实例从父类接收作为自己的属性的私有字段:但使用对象创建的对象.Create(或者通过__proto__ setter或object.setprototypeof稍后设置的原型设置)Don' t接收私有字段-特性。由于私有字段查找仅适用于自己的属性,所以在运营商中找不到这些继承的字段:const a = new(); const o =对象。创建一个 ) ;一种 。测试(o); // false,私有字段是继承的,而不是拥有的。测试(o .__ proto__); // true const o2 = {};目的 。 setProrotypeof(O2,A);一种 。测试(O2); // false,私有字段是继承的,而不是拥有的。测试(O2 .__ proto__); // 真的

访问非现有私有字段抛出错误 - 与正常属性不同,其中访问不存在的属性返回未定义但不会投掷。在私人品牌检查之前,开发人员已被迫使用Try-Catch,以实现对象的案例的返回行为,以便对象没有所需的私有字段:class {sust(obj){try {obj。 #foo; } catch {//案例的回归obj didn' t有#foo}} #foo = 0; }

现在可以使用私有品牌检查来测试私有字段的存在:class {使用(obj){if(#foo在obj){obj。#foo; } else {//案例的回归obj' t有#foo}} #foo = 0; }

但要注意 - 一个私有字段的存在并不能保证该对象具有在类中声明的所有私有字段!以下示例显示了一个半构造的对象,该对象只有其类中声明的两个私有字段中的一个:LET ALOPCONSTED; class {m(){控制台。日志(在此中#x); //真正的控制台。日志(#y在此); // false} #x = 0; #y =(()=> {halfconstructed =这个;掷'错误';});试试{new(); }捕获{}半成品。 m();