注意:

以下的输出都在浏览器的控制台中

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>闭包</title>
</head>
<body>
<script type="text/javascript">
/*** 利用闭包实现* 这个函数给对象o增加了属性存储器方法* 方法名称为get<name>和set<name>。如果提供了一个判断函数* setter方法就会用它来检测参数的合法性,然后再存储它* 如果判定函数返回false,setter方法就会抛出一个异常** 这个函数具有getter和setter函数* 所操作的属性值并没有存储在对象o中* 想反,这个值仅仅是保存在函数中的局部变量中* getter和setter方法同样是局部函数,因此可以访问这个局部变量* 也就是说,对两个存取器方法来设置或或修改这个值*/
function addPrivateProperty(o,name,predicate) {var value;//这是一个属性值//getter方法简单地将其返回o['get'+name] = function(){return value;};//setter方法首先检查值示范合法,若不合法就会抛出异常//否则就将其存储起来o['set'+name] = function(v){if(predicate && !predicate(v))throw Error('set'+name+": invalid value "+v);elsevalue = v;};
}//想的代码展示addPrivateProperty()方法
var o = {};//设置一个空对象//增加属性存储器方法getName()和setName()
//确保只语序字符串值
addPrivateProperty(o,"Name",function(x){return typeof x==="string";});
o.setName("Frank");            //设置属性值
console.log(o.getName());    //获取属性值
try{o.setName(0);            //设置一个非字符值,会抛出一个错误 (由throw语句抛出)
}catch(e){console.log("属性值设置出错"); //上面抛出的错误在这里的到处理
}</script>
</body>
</html>

//第二部分代码://非共享闭包测试
function constfunc(v){return function(){            //返回一个匿名数组return v;                //返回才外部变量 v,
    };
}var funcs = [];
for(var i=0; i<10;i++)funcs[i] = constfunc(i);    for(i=0;i<funcs.length;i++)console.log(funcs[i]());    //在funcs数组中保存的是匿名函数,可通过保存函数的变量后加"()"来执行匿名函数,                   //获取匿名函数中的v的值
//输出:0 1 2 3 4 5 6 7 8 9        由于每次i的值被constfunc函数中的v所存储,注意是每次循环都是重新调用,因而能存到不同的内存空间//共享闭包测试
function constfunc2(){var funcs = [];for(var i=0; i<10;i++)funcs[i] = function(){ return i;};return funcs;
}
var funcs = constfunc2();console.log(funcs[0]());
console.log(funcs[3]());
console.log(funcs[7]());
console.log(funcs[9]());
//输出: 10 10 10 10        //原因://由于这个i在同一次函数调用中,同一个变量中(内存地址不变),//所以当循环执行完i的值为10,在console.log()中的调用每次得到的都是同一个地址上的值,也就是10;

转载于:https://www.cnblogs.com/ctsch/p/6910457.html

JavaScript中闭包实现的私有属性的getter()和setter()方法相关推荐

  1. JavaScript中四种不同的属性检测方式比较

    JavaScript中四种不同的属性检测方式比较 1. 用in方法 var o = {x:1}; "x" in o; //true "y" in o; //fa ...

  2. Java (1)写一个类,名为Animal, 该类有两个私有属性,name(代表动物的名字),和legs(代表动物的腿的条数);要求为两个私有属性提供public的访问方法。并提供两个重载的构造方法,

    Java (1)写一个类,名为Animal, 该类有两个私有属性,name(代表动物的名字),和legs(代表动物的腿的条数);要求为两个私有属性提供public的访问方法.并提供两个重载的构造方法, ...

  3. Vue中computed 计算机属性、getter、setter

    计算属性 在模板表达式中放入太多逻辑时,会让模板重且难以维护.比如: // 错误示例 <div id="example">{{ message.split('').re ...

  4. java实体类没有映射文件_MyBatis自动生成实体类、DAO和XML映射文件,并去掉实体类中的getter和setter方法...

    今天花了3个多小时搞定了这个事情,写个Blog记录一下,先看一下最终生成的实体类吧. packagecom.mybatis.pojo;importlombok.AllArgsConstructor;i ...

  5. java中getter 和 setter 方法有什么意义?为什么不用public代替GS?

    知乎里的一个答案:https://www.zhihu.com/question/21401198 的确可以暴露,如果1. 所有内外代码都是你自己写:2. 这个模块再也不改了:3. 不会继承它,或者继承 ...

  6. Javascript中闭包的作用域链

    作用域定义了在当前上下文中能够被访问到的成员,在Javascript中分为全局作用域和函数作用域,通过函数嵌套可以实现嵌套作用域. 闭包一般发生在嵌套作用域中.闭包是JavaScript最强大的特性之 ...

  7. [转]在Javascript中闭包(Closure)

    转载自: http://baike.baidu.com/view/648413.htm 一.什么是闭包? "官方"的解释是:所谓"闭包",指的是一个拥有许多变量 ...

  8. 浅谈JavaScript中闭包

    引言 闭包可以说是JavaScript中最有特色的一个地方,很好的理解闭包是更深层次的学习JavaScript的基础.这篇文章我们就来简单的谈下JavaScript下的闭包. 闭包是什么? 闭包是什么 ...

  9. 在Javascript中闭包(Closure)

    一.什么是闭包? "官方"的解释是:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 相 ...

最新文章

  1. MSC Apex 2020中文版
  2. 俄亥俄州立大学计算机专业排名,美国俄亥俄州立大学各专业的排名情况介绍
  3. LeetCode每日打卡 - 4的幂
  4. 5G手机江湖:一场卡位战,一位“关键先生”,一个“王者”
  5. field list什么意思_什么是生物信息学?
  6. java过载保护_微服务过载保护原理与实战
  7. 【CocoStudio游戏开发之一】制作多分辨率UI布局
  8. python 抓取豆瓣一拍一所有妹子客片
  9. 二叉排序树和二叉平衡树
  10. 神经网络学习的几种方法
  11. gabor滤波 matlab,图像处理 – 使用matlab应用Gabor方程创建Gabor滤波器
  12. 串口数据visual c++ MSComm 串口控件程序开发
  13. 主数据治理项目实施中存在的问题
  14. @Valid 注解详解 Java Bean Validation的前世今生
  15. 基础矩阵和极点、极线关系
  16. Orc-Battle
  17. 0160 十分钟看懂时序数据库(I)-存储
  18. 什么是jason?jason应该如何使用和解读?jason的语法格式
  19. se 2.4 path 小记。
  20. ehviewer_ehviewer

热门文章

  1. 初次使用 Elasticsearch 遇多种分词难题?那是你没掌握这些原理
  2. 字节跳动又一款中重度游戏曝光,它要进军“漫改MMO”领域!
  3. Linux从零开始(一、安装系统)
  4. 现在给你三百台服务器,你怎么对他们进行管理?
  5. Invalid VCS root mapping
  6. 如何使用Tmux提高终端环境下的效率
  7. 小米11pro和vivox60哪个好
  8. Nginx的几个常用配置和技巧
  9. 机器学习实战-第二章代码+注释-KNN
  10. HDU - 2050 折线分割平面(规律题)