博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js访问器属性之小问题
阅读量:6037 次
发布时间:2019-06-20

本文共 2216 字,大约阅读时间需要 7 分钟。

看js访问器属性时候 有这样一段代码

var book = {        _year: 2004,        edition: 1    }    Object.defineProperty(book, 'year', {        get: function () {            return this._year;        },        set: function (val) {            if (val > 2004) {                this._year = val;                this.edition += val - 2004;            }        }    });    book.year = 2005;    console.log(book.edition);    console.log(book.year);    console.log(book._year);

书中说’ _year  ‘表示是一种常用标记。表示只能通过对象访问的属性。

所以我认为它只是一种标记,可以更改  于是乎我就把'_year' 改成了 ‘year'

var book = {        year: 2004,        edition: 1    }    Object.defineProperty(book, 'year', {        get: function () {            return this.year;        },        set: function (val) {            if (val > 2004) {                this.year = val;                this.edition += val - 2004;            }        }    });    book.year = 2005;    console.log(book.edition);    console.log(book.year);    console.log(book.year2);

可是却爆了这样一个错误    

这个问题先搁置,我们再试一下'_year' 改成了 ‘year2’

var book = {        year2: 2004,        edition: 1    }    Object.defineProperty(book, 'year', {        get: function () {            return this.year2;        },        set: function (val) {            if (val > 2004) {                this.year2 = val;                this.edition += val - 2004;            }        }    });    book.year = 2005;    console.log(book.edition);    console.log(book.year);    console.log(book.year2);

这次又好了。所以我认为书中’year‘有些迷惑人

再来一个终极版本

var book = {        year: 2004,        edition: 1    }    Object.defineProperty(book, 'updateAll', {        get: function () {            return book;//此处可以自定义 别人访问时候返回什么,如果什么都不写 就代表这个属性不让访问        },        set: function (val) {            if (val > 2004) {                this.year = val;                this.edition += val - 2004;            }        }    });    book.updateAll = 2005;    console.log(book.edition);    console.log(book.year);    console.log(book.updateAll);

总结:原来访问器属性,(不是对象属性) 名字随意起名。它的作用就是 决定  你访问或者设置 这个属性的时候  是拒绝,还是做很多事情,比如更新本对象的全部属性,等等。。

 至于刚才内存溢出,就是因为我们 访问器属性的名字 和对象属性的名字一样了,  所以在 这一句  <pre>this.year = val;</pre> 的时候 我们本意是打算调用对象属性,但实际上它又调用了 访问器属性,形成了递归。so~~~

 

 

转载于:https://www.cnblogs.com/WhiteHorseIsNotHorse/p/6275161.html

你可能感兴趣的文章
打开Apache自带的Web监视器
查看>>
企业 SOA 设计(2)–组件化产品开发平台
查看>>
在笛卡尔坐标系上描绘函数2*x+Math.sqrt(5-x*x)及其共轭函数2*x-Math.sqrt(5-x*x)曲线
查看>>
Solr常用查询语法笔记
查看>>
VPC最佳实践(一):网络规划篇
查看>>
Markdown+Pandoc→HTML幻灯片速成
查看>>
《Oracle SQL疑难解析》——1.8 在一个语句中修改多个字段值
查看>>
《当用户体验设计遇上敏捷》一第3章 我是设计师,这与我何干3.1 敏捷与设计矛盾吗...
查看>>
Linux中dd命令详解
查看>>
《Arduino家居安全系统构建实战》——1.2 工作原理
查看>>
《JAVA8开发指南》为什么你需要关注 JAVA8
查看>>
《Redis入门指南》一第5章 实践
查看>>
Android应用性能优化最佳实践.
查看>>
企业分布式微服务云SpringCloud SpringBoot mybatis (六)分布式配置中心(Spring Cloud Config)...
查看>>
spring cloud微服务分布式云架构-Spring Cloud Netflix
查看>>
java B2B2C Springboot仿淘宝电子商城系统--Spring Cloud Gateway
查看>>
HTML_HTML标签区分是IE浏览器还是其它浏览器_已迁移
查看>>
我的友情链接
查看>>
nslookup工具的使用方法
查看>>
eclipse插件
查看>>