学习es6 setter/getter研究

1.背景

   在ES6中,我们对类的定义如下

 1 class Person {
 2     // 构造函数
 3     constructor (name) {
 4         // 属性初始化
 5         this.name = name;
 6     }
 7
 8     // 成员方法
 9     sayName () {
10         console.log(this.name);
11     }
12
13     // 静态方法
14     static sayHi () {
15         console.log("Hi~");
16     }
17 }

  其实本质还是基于javascript原型链机制开发的语法糖

2. 深入setter/getter

2.1 setter/getter的调用执行时机

 1 class Person {
 2     constructor(name,age) {
 3         this.name = name;
 4         this.age = age;
 5     }
 6
 7     set name(name) {
 8         console.log("setter");
 9         this.name = name;
10     }
11
12     get name() {
13         console.log("getter");
14         return this.name;
15     }
16 }    

发现上面的代码报错

/**
*   这是因为,在构造函数中执行this.name=name的时候,就会去调用set name,
*   在set name方法中,我们又执行this.name = name,进行无限递归,
*   最后导致栈溢出(RangeError)。
* */

我们稍作修改,让这个代码可以正常执行,达到我们想要的效果。

 1 // 针对上面的情况,稍作修改
 2 class Person {
 3     constructor(name,age) {
 4         this.name = name;// 执行这里 --- 1
 5         this.age = age;
 6     }
 7
 8     set name(name) { // 进入到这里进行设置  -- 2
 9         console.log("setter");
10         this._name = name;
11     }
12
13     get name() { // 在这里将对应的值返回 --- 3
14         console.log("getter");
15         return this._name;
16     }
17
18     sayName() { // 这里的调用,又从 1-2-3
19         console.log(this.name);
20     }
21 }
22 let p2 = new Person("lisi",22);
23 console.log(p2);// 真实的属性是 age  _name   而不是name
24 p2.sayName();
25 console.log(p2._name);// 如果你访问的是 p2.name  最后会执行 1-3 这两个步骤,会打印出getter    

控制台结果如下:

/**
* 总结
*    只要this.+属性名 和get 属性名/ set 属性名 中,属性名一致,
*    this.name 会去调用getter 和 setter ,也就是说 getter和setter是hock函数
*    而真实存储的属性是 _name 我们可以在实例化后,直接获取
* */

2.2 只有getter定义只读属性

 1 // 只有getter定义只读属性
 2 class foo {
 3     constructor(name) {
 4         this.name = name;
 5     }
 6
 7     get name() {
 8         console.log(`getter函数`);
 9         return this.name;
10     }
11 }
12 //Cannot set property name of #<foo> which has only a getter
13  let p3 = new foo("李四");

/**
* 总结:
*   当一个属性只有getter没有setter的时候,我们是无法进行赋值操作的(第一次初始化也不行),这一点需要注意
*   当没有getter和setter时,就可以正常读写属性
* */

原文地址:https://www.cnblogs.com/xiaqilin/p/8503079.html

时间: 2024-10-08 23:15:44

学习es6 setter/getter研究的相关文章

setter, getter, @property , @synthesize

一,单纯的set get, .h文件 @interface Person : NSObject { NSString *_name; } -(void)setName:(NSString *)name; -(NSString *)getName; @end .m文件 -(void)setName:(NSString *)name { _name = name; } -(NSString *)getName { return _name; } 调用 Person *person = [[Perso

jQuery 3.0 的 setter/getter 模式

jQuery 的 setter/getter 共用一个函数,通过是否传参来表明它是何种意义.简单说传参它是 setter,不传它是 getter. 一个函数具有多种意义在编程语言中并不罕见,比如函数重载:一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载的好处是减少了函数名的数量,避免了名字空间的污染,对于程序的可读性也大有裨益. 函数重载主要体现的两个方面,一是参数的类型.相同个数的参数类型不同可称为函数重载:二是参数的个数,个数不同也称为函数重载.注意,重载与函数的返回值并

你是否也在学习ES6 Promise时遇到过这个问题?

背景 周末闲来无事,随便翻看了一下阮一峰老师的<ES6 标准入门>第2版,ps:之前在阮一峰老师的官网看过电子版,感觉干货满满,所以就买了纸质版:当看到第16章第4节 'Promise.prototype.catch()'时,遇到了一个小困惑,下面我们来一起看一下 开胃汤 首先,Promise.prototype.catch方法是用来'捕获Promise回调函数中自然发生或主动抛出的错误',何为自然发生?何为主动抛出? 自然发生的错误: 1 function a() { 2 var x = 1

黑马程序员_Objective C中的@property 与 @synthesize 快速生成setter getter方法

<a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>.<a href="http://www.itheima.com"target="blank">.Net培训</a>.期待与您交流! 一般来说在一个类中 成员变量是会有setter 跟getter方法的. 如果每一个成员变量的setter 跟gett

使用lombok时@Setter @Getter无效

原文链接 : https://blog.csdn.net/marion158/article/details/87893480 lombok是一个帮助简化代码的工具,通过注解的形式例如@Setter @Getter,可以替代代码中的getter和setter方法,虽然eclipse自带的setter.getter代码生成也不需要我们手动的去敲写,但是使用@Setter @Getter这样的注解,能够使我们的代码看上去更加的简洁.优雅.lombok下有许多常用注解,这里主要讲@Getter和@Se

Kotlin教程学习-伴生对象,getter,setter,内部,局部,匿名类,可变参数

神奇的武汉大学国际软件学院,才大一就要参加暑期实训,现在大二了,考试到7.9,20多天的实训结束了,再过几天,又要提前去上学,可怜我的暑假就这样没了. 接着说Kotlin: 先来看一个名为Message的类 在这个类中有一段包含在companion object中的代码,需要说一下的是,Kotlin的class并不支持static变量,所以需要使用companion object来声明static变量,其实这个platformStatic变量也不是真正的static变量,而是一个伴生对象, 这个

java的Spring学习1--spring引用及属性(setter,getter)注入

1.目录结构 项目->src->main->java->com.test.ppmoney 设置java文件夹为代码  在Project Structure 里的 Modules里 选择相应的目录 后点击 Sources菜单 项目->src->main->resources 设置resources 文件夹为资源  在Project Structure 里的 Modules里 选择相应的目录 后点击 Resources菜单 2. 在依赖文件 pom.xml里添加 sp

基于深度学习的目标检测研究进展

前言 开始本文内容之前,我们先来看一下上边左侧的这张图,从图中你看到了什么物体?他们在什么位置?这还不简单,图中有一个猫和一个人,具体的位置就是上图右侧图像两个边框(bounding-box)所在的位置.其实刚刚的这个过程就是目标检测,目标检测就是"给定一张图像或者视频帧,找出其中所有目标的位置,并给出每个目标的具体类别". 目标检测对于人来说是再简单不过的任务,但是对于计算机来说,它看到的是一些值为0~255的数组,因而很难直接得到图像中有人或者猫这种高层语义概念,也不清楚目标出现在

oc总结第三讲 setter getter 方法 点运算符

本次总结oc中成员变量赋值赋值方法----settet.getter命名方法   点运算符 1.settet.getter命名方法 为对象中的某个实例变量赋值的方法称为修改方法,用来修改对象的状态这类修改方法称为setter 另外对应的取之方法称为getter 命名习惯 -setter方法根据所更改的变量名称来命名      例如   变量名为age   则为setAge -getter方法根据所取得的变量名称来命名      例如   变量名为age,直接为age即可 2.点运算符命名方法 点