1.背景

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

 class Person {
// 构造函数
constructor (name) {
// 属性初始化
this.name = name;
} // 成员方法
sayName () {
console.log(this.name);
} // 静态方法
static sayHi () {
console.log("Hi~");
}
}

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

2. 深入setter/getter

2.1 setter/getter的调用执行时机

 class Person {
constructor(name,age) {
this.name = name;
this.age = age;
} set name(name) {
console.log("setter");
this.name = name;
} get name() {
console.log("getter");
return this.name;
}
}

发现上面的代码报错

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

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

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

控制台结果如下:

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

2.2 只有getter定义只读属性

 // 只有getter定义只读属性
class foo {
constructor(name) {
this.name = name;
} get name() {
console.log(`getter函数`);
return this.name;
}
}
//Cannot set property name of #<foo> which has only a getter
let p3 = new foo("李四");

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

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

  1. 用vue.js学习es6(一):基本工具及配置

    一.工具: sublime,node.js,npm 1.安装sublime 的es6插件: (1).在sublime中按Ctrl+`调出console (2).粘贴以下代码到底部命令行并回车(subl ...

  2. jQuery 3.0 的 setter/getter 模式

    jQuery 的 setter/getter 共用一个函数,通过是否传参来表明它是何种意义.简单说传参它是 setter,不传它是 getter. 一个函数具有多种意义在编程语言中并不罕见,比如函数重 ...

  3. J2EE学习中一些值得研究的开源项(转)

    这篇文章写在我研究J2SE.J2EE近三年后.前3年我研究了J2SE的Swing.Applet.Net.RMI.Collections. IO.JNI……研究了J2EE的JDBC.Sevlet.JSP ...

  4. iPhone开发教程之retain/copy/assign/setter/getter

    assign: 简单赋值,不更改索引计数 copy: 建立一个索引计数为1的对象,然后释放旧对象retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 1. 接触过C,那么 ...

  5. Irrlicht学习之光照的研究

    Irrlicht学习之光照的研究 最近研究一下Irrlicht的光照.发现Irrlicht的光照还是比较简单的,相比低于它的OpenGL和Direct3D,设置光源以及设置光照的参数更加人性化(可能是 ...

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

    背景 周末闲来无事,随便翻看了一下阮一峰老师的<ES6 标准入门>第2版,ps:之前在阮一峰老师的官网看过电子版,感觉干货满满,所以就买了纸质版:当看到第16章第4节 'Promise.p ...

  7. 说声PHP的setter&getter(魔术)方法,你们辛苦了

    php作为快速迭代项目的语言,其牛逼性质自不必多说.今天咱们要来说说php语言几个魔术方法,当然了,主要以setter&getter方法为主. 首先,咱们得知道什么叫魔术方法? 官方定义为:_ ...

  8. 周末,说声php的setter&getter(魔术)方法,你们辛苦了

    php 作为快速迭代项目的语言,其牛逼性质自不必多说.今天咱们要来说说php语言几个魔术方法,当然了,本文主要以setter&getter方法说明为主. 首先,咱们得知道什么叫魔术方法? 官方 ...

  9. Writable atomic property '***' cannot pair a synthesized setter/getter with a user defined

    1. warning: Semantic Issue: Writable atomic property 'number' cannot pair a synthesized setter/gette ...

随机推荐

  1. oracle 索引优化之distinct

    11G R2环境: --DISTINCT测试前的准备drop table t purge;create table t as select * from dba_objects;update t se ...

  2. BZOJ 4358 坑 莫队+线段树 死T

    这是一个坑 竟然卡nsqrt(n)logn T死 等更 //By SiriusRen #include <cmath> #include <cstdio> #include & ...

  3. 比较两个时间的大小 举例:CompareDate("12:00","11:15")

    //比较两个时间的大小 举例:CompareDate("12:00","11:15") function CompareDate(t1, t2) { var d ...

  4. tp5数据库操作 Db类

    一.链接数据库 1.配置文件定义  application\database.php 注意:数据表前缀更改,在文件的prefix选项 2.类定义 二.数据库的基本使用 namespace app\de ...

  5. 用latex画化学结构式

    最近写论文需要画化学结构式,于是想到用Latex里的包.但是一看知乎里面的大牛们一片口诛笔伐,说还是Chemdraw好.用latex是装... 不管怎么说,还是查了一下.首先需要下载chemfig.t ...

  6. Android WebView回退

    在使用webView时,会出现点击按钮让网页页面回到上一个页面的需求,这时可以使用goBack方法. 但是有的安卓用户会习惯点击手机自带的返回按钮,这时会直接关闭当前的activity,而不是网页页面 ...

  7. 实现简单的List功能

    简单的实现javaArrayList(可扩容)功能,实现新增,删除,取数据. package algorithm.data_structure; /** * 模拟ArrayList类的功能 * @au ...

  8. Primitive data types recap

  9. TF基础4

    模型的存储与加载 TF的API提供了两种方式来存储和加载模型: 1.生成检查点文件,扩展名.ckpt,通过在tf.train.Saver()对象上调用Saver.save()生成.包含权重和其他在程序 ...

  10. [实验楼]python11期--NO.1(未完成)

    tuple 是 Python 的一种不可变数据类型,用于列表数据一旦初始化就不会再修改的场景.tuple 只能通过位置索引去访问里面的元素,但有时候我们需要给每个元素取个别名,以便通过别名去获取对应的 ...