TypeScript中Getter/Setter用法详解

 更新时间:2024年10月24日 09:14:14   作者:Hamm  
getter使我们能够将属性绑定到在访问属性时调用的函数,而setter将属性绑定到在尝试设置属性时调用的函数,下面就跟随小编来看看TypeScript中Getter/Setter的用法吧

一、写在前面

第一天

写在前面,先看几段代码,用你的大脑编译运行一下试试? No errors, no warnings!

const config = new Config()
config.version = '1.0.0'
console.log(config.version)

乍一看,这代码会打印 1.0.0,于是跑一下试试?

于是打开 Config 类看看,好家伙

export class Config {
  private _version!: string

  public get version(): string {
    return this._version
  }

  public set version(value: string) {
    this._version = '莫挨劳资'
  }
}

原来是 getter/setter 啊!这玩意我熟!原来 config.version = '1.0.0' 不是给 Config 的 version 字段赋值,而是调用了一个 versionset 方法。

这点我可是很不喜欢的,这已经让人产生了心智负担,赋值、方法调用傻傻分不清楚,还得看了实现才知道。

第二天

你再问我上面的问题,我可不敢拍着胸脯说答案了。

于是第二个问题又来了

const user = new User()
user.name = '彭于晏'
user.age = 33
user.length = '15cm'
console.log(JSON.stringify(user))

凭我三十余年生活经验,这不是在序列化JSON到字符串吗?分分钟在脑海里编译运行,肯定输出这个啊:

{"name":"彭于晏","age":33,"length":"15cm"}

因为昨天上当了,今天还是验证跑一下看看结果:

额,这是什么时候走漏的风声?

表示不服,再一次打开 User 类看看究竟,不看不知道,一看好家伙~

export class User {
  /**
   * # 昵称
   */
  private nickname!: string

  public get name(): string {
    return this.nickname
  }

  public set name(value: string) {
    this.nickname = 'Hamm'
  }

  /**
   * # 年龄
   */
  private year!: number

  public get age(): number {
    return this.year
  }

  public set age(value: number) {
    this.year = 22
  }

  /**
   * # 长度
   */
  private len!: string

  public get length(): string {
    return this.len
  }

  public set length(value: string) {
    this.len = `${parseInt(value.replace('cm', '')) + 3}cm`
  }
}

这谁干的!干得漂亮!!!

以上剧情纯属事实,如有雷同,你也很棒!

二、我不太喜欢Getter和Setter

1. vscode自动重构的属性名带下划线

vscode 提供了属性一键自动生成 getter/setter,为了保持属性名和方法名不重复,于是会自动生成一个属性名前面加下划线的新属性,然后将原属性干掉并生成 get set 两个方法。

生成的最终结果如下图

虽然在生成过程中可以新起一个自定义属性名,但我真的很烦,如果使用默认,我的 eslint 规则又会认为 属性名不符合规范。。。

2. 调用方的心智负担

如下面之前贴过的代码:

const config = new Config()
config.version = '1.0.0'
console.log(config.version)

在不阅读 Config 类的情况下,会主观认为 config.version = "1.0.0" 是在给 属性赋值,而调用 let version = config.version 会认为是将刚才赋的值取出来使用。

3. Get/Set方法和普通方法区别对待

在有 private protected public 等访问修饰符的情况下,类本身有 属性方法构造 就已经足够满足需求了,这里非得上一个 get set 连写法都要区别对待的特殊方法形式,构造方法 constructor 表示第一个不服,劳资都没特殊对待,凭什么它俩要特殊对待?

4. 我理解的属性

属性应该是一个类上最基础的最终数据存储,设置到属性上的值是什么,那取出来的值也一定得是什么:

老张,我这瓶水放你这,一会我来拿。

这里我其实是调用了老张的一个赋值。所以一会回来拿到的水,还是那瓶水:

const store = new Store()
store.water = "哇哈哈"

// a few moments later

console.log(store.water) // 哇哈哈

所以,上面的输出一定得是 哇哈哈 才合理, 第一天碰到的问题,就不应该存在。

5. 我理解的方法

方法应该是一个类上的 委托事项流程 的整合体,不管是普通方法,还是get/set,甚至是 构造方法。

只是构造方法比较特殊,也应该是整个类中唯一的特殊。

get / set 方法都应该只是从规范上形成的一些约定俗成的方法,而且既然是方法,get / set 的调用都应该加上 括号 (),才会便于理解。而且方法名和属性名也没有一定不重复的限定。

三、Getter/Setter的优势

简单说一些吧。

1. 数据拦截

利用 get set 方法来做数据拦截,这个点这篇文章中不过多讲,可以参考一些前端框架的双向数据绑定实现来学习。

2. 数据转换

在前后端数据转换时,除了我们之前使用的 基于装饰器-我是这么处理TypeScript项目数据转换的 之外,使用 get set 来做数据转换可能也会是一个很棒的方式(当然,属性名get/set 不能重复的问题,还可以再思考思考)。

以上就是TypeScript中Getter/Setter用法详解的详细内容,更多关于TypeScript Getter/Setter的资料请关注脚本之家其它相关文章!

相关文章

  • 利用JavaScript实现春节倒计时效果(移动端和PC端)

    利用JavaScript实现春节倒计时效果(移动端和PC端)

    这篇文章主要介绍了通过Html+Css+js如何实现春节倒计时效果,本文同时介绍了移动端和PC端两种效果,感兴趣的同学可以跟随小编一起动手试试
    2022-01-01
  • JS中let的基本用法举例

    JS中let的基本用法举例

    ES6新增了let命令,用来声明变量,它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,下面这篇文章主要给大家介绍了关于JS中let的基本用法,需要的朋友可以参考下
    2023-01-01
  • JavaScript实现表格表单的随机选择和简单的随机点名

    JavaScript实现表格表单的随机选择和简单的随机点名

    本文主要介绍了JavaScript实现表格表单的随机选择和简单的随机点名,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • ES6对象操作实例详解

    ES6对象操作实例详解

    这篇文章主要介绍了ES6对象操作,结合实例形式详细分析了ES6对象创建、赋值、比较、合并等相关操作技巧与注意事项,需要的朋友可以参考下
    2020-05-05
  • JavaScript中利用Array和Object实现Map的方法

    JavaScript中利用Array和Object实现Map的方法

    这篇文章主要介绍了JavaScript中利用Array和Object实现Map的方法,实例分析了javascript实现map的添加、获取、移除、清空、遍历等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 详解如何较好的使用js

    详解如何较好的使用js

    本文将对在网页中引用js常会出现的问题进行汇总,并提出解决问题的具体方案,有助于我们更好的学习和使用js,需要的朋友一起来看下吧
    2016-12-12
  • uni-app实现NFC读取功能

    uni-app实现NFC读取功能

    这篇文章主要为大家详细介绍了uni-app实现NFC读取功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • es6新增对象的实用方法总结

    es6新增对象的实用方法总结

    在JavaScript中,几乎每一个值都是某种特定类型的对象,于是ES6也着重提升了对象的功能性,下面这篇文章主要给大家介绍了关于es6新增对象实用方法的相关资料,需要的朋友可以参考下
    2022-05-05
  • 前端实现图片压缩方案总结(干货)

    前端实现图片压缩方案总结(干货)

    这篇文章主要介绍了前端实现图片压缩的几种方法和技术,包括使用HTML5的canvas元素和推荐的第三方库image-magic-adapter,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • JS下载文件|无刷新下载文件示例代码

    JS下载文件|无刷新下载文件示例代码

    JS下载文件的实现在网上可以找到很多教程,不过本文为大家介绍的是无刷新下载文件,貌似更酷一点是吧
    2014-04-04

最新评论