前言
TypeScript的类装饰器是一种强大的功能,它允许开发者在类声明前应用装饰器函数,以自定义类的行为和属性。这些装饰器可以用于各种用途,如添加元数据、修改类的原型或行为,或者执行某些操作。通过类装饰器,开发者可以更灵活地扩展和定制类,提高了代码的可维护性和可读性。这个功能在TypeScript中广泛用于框架和库的开发,以及在实际应用中,帮助开发者实现更高级的功能和模式。
类装饰器
类装饰器在类声明之前绑定(紧靠着类声明) 类装饰器可以用来监视,修改或替换类的定义 在执行类装饰器函数的时候, 会把绑定的类作为其唯一的参数传递给装饰器
function test(target: any) { console.log(target); target.prototype.personName = 'yangbuyiya'; target.prototype.say = (): void => { console.log(`my name is ${target.prototype.personName}`); } } @test class Person { } interface Person { say(): void; } let p = new Person(); p.say();
如果类装饰器返回一个新的类,它会将新的类来替换原有类的定义
function test<T extends { new(...args: any[]): {} }>(target: T) { return class extends target { name: string = 'yangbuyiya'; age: number = 18; } } @test class Person { } let p = new Person(); console.log(p);
defineProperty
什么是 defineProperty
TypeScript的Object.defineProperty
是一种用于在对象上定义属性的方法。它允许开发者以精确的方式定义属性的特性,如可枚举性、可配置性和可写性。这对于创建高度可控的对象属性非常有用,尤其在涉及数据封装和对象安全性的情况下。在TypeScript中,Object.defineProperty
可用于创建getter和setter方法,从而实现属性的自定义行为。这一功能通常用于实现数据访问和保护,确保对象的属性在外部被正确使用和维护。通过Object.defineProperty
,开发者可以更精细地管理对象属性,提高代码的可维护性和安全性。
Object.defineProperty()
MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty可以直接在一个对象上定义一个新属性 或者修改一个对象的现有属性,并返回此对象
定义一个新的属性
let obj = {age: 18}; Object.defineProperty(obj, 'name', { value: 'yangbuyiya' }); console.log(obj);
修改原有属性
let obj = {age: 18}; Object.defineProperty(obj, 'age', { value: 34 }); console.log(obj);
修改属性配置-读写
let obj = {age: 18}; Object.defineProperty(obj, 'age', { writable: false }) obj.age = 34; console.log(obj.age);
修改属性配置-迭代
let obj = {age: 18, name: 'yangbuyiya'}; Object.defineProperty(obj, 'name', { enumerable: false }) for (let key in obj) { console.log(key); }
修改属性配置-配置
如果你在配置之前想让所有的属性都出现在迭代当中,然后后面又不想让其全部出现了那么这个时候在通过 enumerable、configurable = true 改变是没有作用的:
let obj = {age: 18, name: 'yangbuyiya'}; Object.defineProperty(obj, 'name', { enumerable: false, configurable: true }); Object.defineProperty(obj, 'name', { enumerable: true, configurable: true }); for (let key in obj) { console.log(key); }
在之前是什么样子了就不能再次去进行配置了。
最后
本期结束咱们下次再见👋~
🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗