发现问题的代码如下:

<html>
<script type="text/javascript">
var module=(function(){
//private varibles
var grades=undefined;
console.log("self invoking grades="+grades);
//private methods
var setGrades=function(x){
grades=x;
console.log('in the set mehod grades='+grades);
}
//public api
return {
grades:grades, //这种写法无法应用到最新的值
setGrades:setGrades
}
})();
console.log('before set grades grades='+module.grades);
module.setGrades(10);
console.log('after set grades grades='+module.grades);
</script>
</html>
如上图所示,上面返回对象中对私有变量的引用,并没有引用到最新的值
改进后写法如下:
主要有几种方式:1.使用函数返回私有变量值;2.自己定义返回对象的属性,注意只定义get,这样不会破坏封装;
<html>
<script type="text/javascript">
var module=(function(){
//private varibles
var grades=undefined;
console.log("self invoking grades="+grades);
//private methods
var setGrades=function(x){
grades=x;
console.log('in the set mehod grades='+grades);
}
//public api
var rtnObj={
//grades:grades,//不适用直接返回的
setGrades:setGrades
}
//改为使用返回对象定义只读属性,修复出现的问题
Object.defineProperty(rtnObj, "grades", {
get: function () { // function that's executed when you use `.grades`
return grades;
}
});
return rtnObj;
})();
console.log('before set grades grades='+module.grades);
module.setGrades(10);
console.log('after set grades grades='+module.grades);
</script>
</html>
通过上面截图可以看出,在设置完grades后,可以正常在外部访问到最新的grades的值了。
之所以这样,是因为直接返回时(grades:grades)其实是直接返回一个值,即(grades:undefined),后续对grades变量的修改,并不会反映到返回对象的grades属性上;
https://stackoverflow.com/questions/8893099/javascript-revealing-module-pattern-public-properties

Javascript Module Pattern,公共属性不能获取到最新值(Javascript revealing module pattern, public properties)相关推荐

  1. React中 useState在合成事件中是异步的,怎么获取到useState 设置后的最新值,或者说setState中获取到最新值

    useState 在合成事件中是异步的 合成时间是什么呢 合成事件: 简单来说 比如onClick,或者 onChange 或者说是 Input之类的事件 所以一个情景是这样的 当你在onClick ...

  2. hibernate4.3 无法获取数据库最新值

    在用ssh框架的时候遇到一个问题(hibernate版本号4.3) 问题描写叙述:web端和应用程序都能够读写数据库.当应用程序改动数据库后.hibernate无法读取最新值,读出来的一直都是旧数据. ...

  3. java根据属性获取对象_java反射工具类--通过指定属性名,获取/设置对象属性值

    java对象通过点运算符操作对象属性的方式没法使用for,while等循环,此工具主要解决这一问题. 例如:有一对象包含属性有一定规律 obj1: { name1: "张三", a ...

  4. spring 获取配置文件的值

    Spring 获取配置文件的值 package com.hafiz.www.util;import org.slf4j.Logger; import org.slf4j.LoggerFactory;i ...

  5. 前端JS获取ModelMap的值 2020-09-03

    问题描述: 前端获取ModelMap的值 Controller: @GetMapping("/turnDispatch/{workNo}")public String turnDi ...

  6. html+设置img+src属性值,javascript获取、设置修改img的src属性(get/setAttribute)

    在开发网站过程中,事先就设置好了图片img的src性,一般来说很少修改这个属性,网站加载时直接显示事先设置好的图片.但如果网页要求实现滚屏加载图片(动态加载图片),也就是一次不显示网页内的所有图片,当 ...

  7. 谷歌浏览器不支持javascript 属性对象获取问题

    谷歌浏览器 JavaScript 属性对象获取问题 首先陈述一下我遇到的问题 我在img标签里面添加自定义属性fileName <img fileName="0_0.png" ...

  8. JavaScript属性的获取、设置和移除还有自定义属性

    文章目录 获取属性值 设置属性值 移除属性值 H5自定义属性 自定义属性的目的是为了保存并使用数据.有些数据可以保存到页面中而不用保存到数据库中. 获取属性值 element.属性 获取属性值 ele ...

  9. 如何获取HTML元素对应JavaScript对象?

    <!DOCTYPE html> <html><head><meta charset="UTF-8"><title>< ...

  10. GridView 类型公开的所有成员(公共属性、公共方法、私有属性.......)

    下表列出了由 GridView 类型公开的成员. 公共构造函数   名称 说明 GridView 初始化 GridView 类的新实例. 页首 公共属性 (请参见 受保护的属性 )   名称 说明 A ...

最新文章

  1. OCS2007安装配置指南
  2. MyBatis源码分析——MyBatis的扩展点(pugins)
  3. 微型计算机原理课程设计计算器,微机原理课程设计简易计算器的设计.docx
  4. Java基础- super 和 this 解析
  5. bzoj:2018 [Usaco2009 Nov]农场技艺大赛
  6. linux vi 中s 替换方法
  7. jquery中几种层级选择器的详细说明
  8. FOSCommentBundle功能包:指南索引页
  9. 华为tftp服务器如何配置文件,配置tftp服务器
  10. matlab如何调用swmm,一套基于SWMM开放的城市管网系统控制设计
  11. OSN3500 华为SDH全新板卡备件升级扩容
  12. wps里面函数怎么使用_WPS表格中常用文本函数的用法
  13. 计算机的应届毕业生简历上可以写什么,计算机应届生简历范文计算机专业应届毕业生简历写.doc...
  14. 电子皮肤综述阅读-鲍哲南-2019
  15. 12款多媒体能力SDK与开发平台盘点
  16. 智能重卡产品研发的三种逻辑博弈
  17. C/C++基础讲解(二十六)之数值计算与趣味数学篇(打鱼还是晒网与怎样存钱以获取最大利息)
  18. 使用su命令切换到别的用户时报su:无法打开会话:权限被拒绝
  19. 工业机器人实训实验平台
  20. Python中读取,显示,保存图片的方法

热门文章

  1. 美团点评RPC框架pigeon实现原理及源码解析
  2. java窗体图片_JAVA窗体添加背景图片
  3. 【服务器】 Windows Server 2008 R2 配置HTTPS TLS1.2
  4. android恢复短信中心号码,短信中心号码怎么查 安卓手机查看短信中心号码方法...
  5. 新人如何快速熟悉一个新项目
  6. [数据可视化] 柱状图
  7. MQTT网关是什么?
  8. HTTPs SSL OV、DV和EV证书的区别
  9. java代码楼房销售管理系统_secondHouse2 java二手房交易管理系统,针对房地产楼房销售的 Develop 272万源代码下载- www.pudn.com...
  10. 洛谷P4563 [JXOI2018]守卫