首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么enumerable: false不级联到TypeScript中的继承类?

在TypeScript中,当我们使用类继承时,可以通过设置属性的enumerable属性为false来控制该属性是否可枚举。然而,这个设置不会级联到继承类中的属性。

这是因为在TypeScript中,继承是通过原型链来实现的。当一个类继承另一个类时,它实际上是继承了父类的原型对象,而不是直接继承父类的属性。因此,父类中设置的enumerable属性不会直接影响到继承类。

举个例子来说明,假设有一个父类Parent和一个继承类Child,并且在父类中有一个属性name,并将其设置为enumerable: false。在父类中,这个属性将不可枚举,即无法通过for...in循环遍历到。

代码语言:typescript
复制
class Parent {
  name: string;

  constructor(name: string) {
    this.name = name;
    Object.defineProperty(this, 'name', { enumerable: false });
  }
}

class Child extends Parent {
  age: number;

  constructor(name: string, age: number) {
    super(name);
    this.age = age;
  }
}

const child = new Child('Alice', 10);

for (const key in child) {
  console.log(key); // 输出 'age',而不会输出 'name'
}

在上面的例子中,尽管父类Parent中的name属性被设置为不可枚举,但在继承类Child中仍然可以通过for...in循环遍历到。

总结来说,enumerable: false只会影响到当前类中的属性是否可枚举,而不会级联到继承类中。这是因为继承是通过原型链实现的,继承类实际上继承了父类的原型对象,而不是直接继承父类的属性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavaString能否被继承为什么

不能被继承,因为String有final修饰符,而final修饰是不能被继承。...{ // 省略...  } final修饰符用法: 1.修饰   当用final修饰一个时,表明这个不能被继承。...final成员变量可以根据需要设为final,但是要注意final所有成员方法都会被隐式地指定为final方法。 ? 2.修饰方法   使用final修饰方法原因有两个。...第一个原因是把方法锁定,以防任何继承修改它含义;第二个原因是效率。在早期Java实现版本,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来任何性能提升。...注:一个private方法会隐式地被指定为final方法。

1.9K60
  • Hibernate实体为什么继承Serializable?

    hibernate有二级缓存,缓存会将对象写进硬盘,就必须序列化,以及兼容对象在网络传输 等等。...没有实现此接口将不能使它们任一状态被序列化或逆序列化。序列化所有子类本身都是可序列化。这个序列化接口没有任何方法和域,仅用于标识序列化语意。...,或者在其他程序利用这些保存下来对象。...为了对象序列化而需要继承接口也只是一个象征性接口而已,也就是说继承这个接口说明这个对象可以 被序列化了,没有其他目的。...接口,此外,在Java Web应用,如果希望对HttpSession存放Java对象进行持久化,那么这个Java对象所属也必须实现Serializable接口。

    1.2K30

    群友:事务异常也抛出了,为什么没catch而回滚?

    上周,我们通过这篇文章《为什么catch了异常,但事务还是回滚了?》...所以,这里教大家一个简单方法来理解这次test4catch为什么没有捕获异常。...org.springframework.orm.jpa.JpaTransactionManager 然后尝试触发test4执行,通过DEBUG,我们都可以观察: test4我们加断点,除了47行没进入...所以,前文中我们跟踪事务回滚所抛出异常,其实是在test4try-catch块执行完之后才抛出,所以内部这个catch是无法捕获异常,这里完全就是catch了个寂寞。...通过日志,我们也能观察这样执行顺序: 好了,通过这样来看,是不是要比之前有进一步理解了呢?如果您还想更深入了解事务底层运行机制,一定要debug下源码,自己过一遍,理解会深刻哦!

    46420

    TypeScript中使用装饰器

    ---- Decorator装饰器是ES7时候提案特性,目前处于Stage 3候选阶段(2022年10月)。 装饰器简单来说就是修改方法语法糖,很多面向对象语言都有装饰器这一特性。...因此适合用于继承一个现有并添加一些属性和方法。...注意  TypeScript 不允许同时装饰一个成员 get 和 set 访问器。因此,如果想为一个成员访问器添加装饰器,则必须添加在该成员在文档顺序上第一个访问器前。...但属性装饰器key不同: 方法装饰器描述器key为: value writable enumerable configurable 访问器装饰器描述器key为: get set enumerable...: false, // configurable: false // } // Hello, Peter 参数装饰器 单独参数装饰器能做事情很有限,它一般都被用于记录可被其它装饰器使用信息

    1.1K20

    【Angular专题】 (3)装饰器decorator,一块语法糖

    装饰者模式,是指在不必改变原文件或使用继承情况下,动态地扩展一个对象功能,为对象增加额外特性一种设计模式。...考虑javascript函数参数为对象时只传递地址这一特性,装饰者模式实际上是非常好复现,掌握其基本知识对于理解Angular技术栈原理和执行流程是必不可少,从结果角度来看,使用装饰器和直接修改定义没有什么区别...Typescript装饰器 2.1 装饰器 装饰器,就是用来装饰,它只接受一个参数,就是被装饰。...__testable);//false 更常用方式依然是利用高阶函数返回一个可被外部控制装饰器: function enumerable(value: boolean){ return function...,将相关信息存储一个外部数组,可以看出参数装饰器并*未对参数本身做出什么修改。

    1.2K30

    如何用 Decorator 装饰你 Typescript

    所谓切面方案就是我们常说切面编程 AOP。一种编程思想,简单直白解释就是,一种在运行时,动态将代码切入指定方法、指定位置上编程思想就是 AOP。...为什么要使用 Decorator 为什么要使用 Decorator,其实就是介绍 AOP 范式最大特点了:非侵入式增强。...网上有很多推荐 or 推荐 Typescript 之类文章这里我们不做任何讨论,学与不学,用或不用,利与弊。各自拿捏~ 再说说 typescript,其实对于 ts 相比大家已经陌生了。...TypeScript 精通指南 Typescript Decorator 签名 interface TypedPropertyDescriptor { enumerable?...注意,在 Typescript class 关键字只是 JavaScript 构造函数一个语法糖。由于装饰器参数是一个构造函数,其也应该返回一个构造函数。

    1.2K20

    _TypeScript笔记4

    一.成员 TypeScript定义与ES6 Class规范一致,静态属性,实例属性,访问器等都支持: class Grid { static origin = {x: 0, y: 0}...符合TypeScript设计原则: 不给编译产物增加运行时开销 另外,成员可访问性也是类型检查一部分,private/protected修饰符会打破鸭子类型,例如: class Animal {...&& superClass.prototype, { constructor: { value: subClass, enumerable: false, writable...__proto__ || Object.getPrototypeOf(A)).apply(this, arguments) } TypeScriptClass继承也会被编译替换成基于原型继承,如下...编译产物更健壮,因为其目标是: 在任何支持 ES3+宿主环境运行 P.S.比较有意思是静态属性继承,具体见一.如何继承静态属性?

    72450

    JavaScript 设计模式学习第十四篇-装饰者模式

    TypeScript 装饰器 现在越来越多前端项目或 Node 项目都在拥抱 JavaScript 超集语言 TypeScript,如果你了解过 C# 特性 Attribute、Java...注解 Annotation、Python 装饰器 Decorator,那么你就不会对 TypeScript 装饰器感到陌生,下面我们简单介绍一下 TypeScript 装饰器。...TypeScript 装饰器可以被附加到声明、方法、访问符、属性和参数上,装饰器类型有参数装饰器、方法装饰器、访问器。...我们经常使用继承方式来实现功能扩展,但这样会给系统带来很多子类和复杂继承关系,装饰者模式允许用户在不引起子类数量暴增前提下动态地修饰对象,添加功能,装饰者和被装饰者之间松耦合,可维护性好;...由于更大灵活性,也就更容易出错,特别是对于多级装饰场景,错误定位会更加繁琐; 6. 装饰者模式适用场景 1. 如果希望系统增加很多子类,那么可以考虑使用装饰者模式; 2.

    41620

    TypeScript-装饰器和TypeScript-defineProperty

    前言TypeScript装饰器是一种强大功能,它允许开发者在声明前应用装饰器函数,以自定义行为和属性。这些装饰器可以用于各种用途,如添加元数据、修改原型或行为,或者执行某些操作。...通过装饰器,开发者可以更灵活地扩展和定制,提高了代码可维护性和可读性。这个功能在TypeScript中广泛用于框架和库开发,以及在实际应用,帮助开发者实现更高级功能和模式。...在TypeScript,Object.defineProperty可用于创建getter和setter方法,从而实现属性自定义行为。...(obj, 'name', { enumerable: false, configurable: true});Object.defineProperty(obj, 'name', {...最后本期结束咱们下次再见~ 关注我迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复

    31900

    typescriptclass和interface

    typescript这个东西说实在,真的是容易忘记,一段时间不用就感觉特别陌生,但是回过头来看看,又有一种熟悉感觉,有句话这么说ts越用越香,它确实能够规范我们书写格式,语法校验和类型校验等。...class 首页我们要清楚一点是typescript和javascriptES6语法区别,千万不要混淆。ts相比于js添加了声明属性类型和参数类型以及返回结果类型。...abstract关键字表示抽象,抽象是不能被实例化即new,只能被继承,抽象一般是用来封装一些公共,提供给子类使用方法和属性 abstract class Animal{ public...():void; //抽象和方法包含具体实现 必须在子类实现 } //接口里方法都是抽象 interface Flying{ fly():void } interface Eating...{ eat():void } class Dog extends Animal{ speak(){ console.log("汪汪汪") //重写:子类重写继承自父方法

    1.9K10

    TS 设计模式05 - 装饰者模式

    简介 在 oop 继承是实现多态最简单方案。同一对象会有不同表现时,我们基于此基去写派生即可。但有时候,过度使用继承会导致程序无法维护。...一个人可以选择穿 T-shirt,裤子,裙子,外套等等,它顺序和搭配是固定,如果使用继承,我们对每种组合都需要去定义一个,比如穿裤子的人,穿裙子的人,穿裤子和裙子的人,先穿裤子再穿外套的人......访问器装饰器不能用在声明文件(.d.ts),或者任何外部上下文(比如 declare)里。 ps: TypeScript不允许同时装饰一个成员get和set访问器。...装饰器应用到。 4. 小结 装饰器模式是一个非常重要设计模式,在很多场景下可以用来替代继承,增加代码可维护性。...精读TC39 与 ECMAScript 提案 探寻 ECMAScript 装饰器 TypeScript Decorator & 元数据反射:从小白专家(部分 IV) TypeScript

    1.2K10

    ES6--对象扩展

    方法用于对象合并,将待合并对象所有可枚举属性,复制目标对象。...Object.assign拷贝属性是有限制,只拷贝源对象自身属性(拷贝继承属性),也拷贝不可枚举属性(enumerable: false)。...目前有四个操作会忽略enumerablefalse属性: for..in循环: 只遍历自身和继承可枚举属性 Object.keys(): 返回对象所有可枚举属性键名 JSON.stringify...实际上,引入“可枚举”(enumerable)这个概念最初目的,就是让某些属性可以规避掉for...in操作,不然所有内部属性和方法都会被遍历。...([], 'length').enumerable // false 上面代码,toString和length属性enumerable都是false,因此for...in不会遍历这两个继承自原型属性

    60820

    从java注解漫谈到typescript装饰器——注解与装饰

    装饰器可以天生跑在运行时,注解还要通过反射(拿不到类型本身)继承模式是丰富子元素“内涵”一种重要方式,不管是继承接口还是子类继承。...而装饰者模式可以在不改变继承关系前提下,包装先有的模块,使其内涵更加丰富,并不会影响原来功能。与继承相比,更加灵活。...装饰器最为强大功能之一是它能够反射元数据(reflect metada)为什么需要在JavaScript中进行反射?反射用于描述能够检查同一系统(或其自身)其他代码代码。...如果修饰静态函数,那么target就是本身。key: 该函数函数名。descriptor:该函数描述属性,比如 configurable、value、enumerable等。...与继承相比,也更加灵活,可以从装饰装饰函数参数,可以说武装到了“牙齿”。Typescript元数据操作可以通过reflect-metadata包来实现对于元数据操作。

    95610

    全新 Javascript 装饰器实战上篇:用 MobX 方式打开 Vue

    为什么? 经过调试会发现我们在 observable defineProperty 并没有生效?...更倾向于将装饰器当做一个纯函数(管道、转换器)来使用,尽量包含副作用(比如修改结构)。...Typescript 为新版装饰器提供了更严格类型检查 目前装饰器还未成为正式语言特性,排除后面还有特性变更。 截止至文章发布时间,Vite 使用新版装饰器还有一些问题。...属性装饰器返回值是一个函数,这个实际上就是一个 initializer 访问不到原型 在 initializer 也不能调用 defineProperty。...邪恶副作用… 主要原因是上述代码我们在 addInitializer 引用 ‘value’ 是原始 getter 值,而我们又重新用 defineProperty 覆盖了属性,导致 @log

    49720

    Babel下ES6兼容性与规范

    一、兼容性问题现状   针对ES6新特性兼容性问题,目前解决方案是使用语法解析转换工具将es6语法转化为大部分浏览器识别的es5语法,通用转化方案有babel,traceur,jsx,typescript...//kangax.github.io/compat-table/es6/ 考虑解决方案多样性,我么会着重考虑以下几个问题: 1,兼容性:是否能解决目前常见所有语法兼容转换 2,易用性:能够很方便接入现有的开发构建体系...ES6新特性在Babel下兼容性列表 ES6特性 兼容性 箭头函数 支持 声明和继承 部分支持,IE8不支持 增强对象字面量 支持 字符串模板 支持 解构 支持,但注意使用方式 参数默认值,不定参数...1.2 声明和继承 //定义 class Animal { //ES6新型构造器 constructor(name) { this.name = name;...} //实例方法 sayName() { console.log('My name is '+this.name); } } //继承 class Programmer

    98610

    Babel下ES6兼容性与规范

    一、兼容性问题现状 针对ES6新特性兼容性问题,目前解决方案是使用语法解析转换工具将es6语法转化为大部分浏览器识别的es5语法,通用转化方案有babel,traceur,jsx,typescript...//kangax.github.io/compat-table/es6/ 考虑解决方案多样性,我么会着重考虑以下几个问题: 1,兼容性:是否能解决目前常见所有语法兼容转换 2,易用性:能够很方便接入现有的开发构建体系...ES6新特性在Babel下兼容性列表 ES6特性 兼容性 箭头函数 支持 声明和继承 部分支持,IE8不支持 增强对象字面量 支持 字符串模板 支持 解构 支持,但注意使用方式 参数默认值,不定参数...1.2 声明和继承 //定义 class Animal { //ES6新型构造器 constructor(name) { this.name = name;...} //实例方法 sayName() { console.log('My name is '+this.name); } } //继承 class Programmer

    2K00

    JS原生方法原理探究(六)从 Babel 转译过程浅谈 ES6 实现继承原理

    ,可以说它本质就是 ES5 寄生组合式继承。...为什么设置 enumerable: false 呢?因为默认就是不可枚举设置也行。...最后,我们设置子类 __proto__ 指向父,这是 ES5 没有的,目的是让子类继承静态方法(可以直接通过调用方法)。...之后,result 可能有三种取值: 一个继承了父实例所有属性子类实例 父构造函数调用结果,可能是父构造函数自定义返回一个非空对象 父构造函数调用结果,可能是默认返回 undefined...这里 result 我们知道也有两种取值,如果是一个继承了父实例所有属性子类实例,那么实际上等价于经过增强 this;如果是父构造函数自定义返回一个非空对象,则意味着调用 Son构造函数之后返回对象实际上并没有继承声明实例属性

    1.1K20
    领券