注意:

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

<!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);
else
value = 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;

JavaScript中闭包实现的私有属性的getter()和setter()方法的更多相关文章

  1. [转载]Python使用@property装饰器--getter和setter方法变成属性

    原贴:为什么Python不需要getter和setter getter 和 setter在java中被广泛使用.一个好的java编程准则为:将所有属性设置为私有的,同时为属性写getter和sette ...

  2. 字段是字段,属性是属性,字段不是属性,属性看getter或setter

    1.看图猜字段和属性 2.结果是一个属性[字段麻,太明目张胆啦,就是2啦],又是哪个属性能够显示出来呢? 3.这是为什么呢? 让我们回到javabean的课堂~~~ ★ javaBean中的prope ...

  3. 在Javascript中闭包(Closure)

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

  4. javascript中闭包最简单的简绍

    javascript中闭包是什么 JavaScript 变量可以是局部变量或全局变量.私有变量可以用到闭包.闭包就是将函数内部和函数外部连接起来的一座桥梁. 函数的闭包使用场景:比如我们想要一个函数来 ...

  5. JavaScript中易混淆的DOM属性及方法对比

    JavaScript中易混淆的DOM属性及方法对比 ParentNode.children VS Node.prototype.childNodes ParentNode.children:该属性继承 ...

  6. 在JavaScript中闭包的作用和简单的用法

    在JavaScript中闭包的作用和简单的用法 一.闭包的简介 作用域链:在js中只有函数有作用域的概念,由于函数内能访问函数外部的数据,而函数外部不能访问函数内部的数据,由上述形成一种作用域访问的链 ...

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

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

  8. 使用 JavaScript 中的 document 对象的属性,根据下拉框中选择的属性,更改页面中的字体颜色和背景颜色

    查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的 document 对象的属性,根据下拉框中选择的属性,更改页面中的字体颜色和背景颜色 实现思路: 在页面的 <body&g ...

  9. 对象存取器属性:getter和setter

    在一个对象中,操作其中的属性或方法,通常运用最多的就是读(引用)和写了,譬如说o.a,这就是一个读的操作,而o.b = 1则是一个写的操作.事实上在除ie外最新主流浏览器的实现中,任何一个对象的键值都 ...

随机推荐

  1. 前端设计技巧——用 Promise 处理交互和异步

    本文仅表达前端的一些设计技巧,如果您在查阅js技术,请忽略此文! 前端开发经常会遇到这样的场景: 当满足一定条件时,需要弹出一个模态框,以便接收用户的输入.然后根据不同的输入,进行不用的操作. (ps ...

  2. .NET框架及C#语言基础

    1.Microsoft.NET框架结构是一个面向网络,支持各种用户终端的开发平台. 2..NET框架的主要内容有CLR,FCL,ADO.NET,XML,ASP.NET,WinForms和WebSeri ...

  3. STM32伺服编码器接口

    在STM32的高级定时器和一般定时器中有Encoder interface mode(编码器接口),TI1和TI2分别对应TIM_CH1 和TIM_CH2 通道. 一.计数规则如下: 表55的是编码器 ...

  4. xampp教程(一):xampp下载,安装,配置,运行PHP的web项目

    本来没有想着弄PHP,但是有同学叫我帮忙启动一下一个PHP写的后台.着实需要去学习一下. 想着安装xampp软件,一个集合了多个服务器,多个数据库,多个后台语言的管理软件. 一.xampp下载 二.安 ...

  5. Mavnen的几种依赖关系

    学习mavnen的时候有几种依赖关系 首先,说一下maven的依赖关系用来干什么? 就是用来控制编译.测试.运行三种classpath的关系 1.compile 的范围 当依赖的scope为compi ...

  6. [转]以新浪为例浅谈XSS

    随着网络时代的飞速发展,网络安全问题越来越受大家的关注,而SQL注入的攻击也随着各种防注入的出现开始慢慢的离我们而去,从而XSS跨站脚本攻击也慢慢的开始在最近几年崛起,也应对了’没有绝对的安全’这句话 ...

  7. C# 调用cmd.exe的方法

    网上有很多用C#调用cmd的方法,大致如下: [c-sharp] view plaincopy private void ExecuteCmd(string command)   {   Proces ...

  8. ex2:逻辑回归及正则条件下的练习

    EX2 逻辑回归练习 ​ 假设你是一个大学某系的管理员,你想根据两项考试结果来确定每个申请人的录取机会.你有以前申请人的历史资料以作为逻辑回归的训练集.对于每一个训练集,你拥有每个申请人的两项考试的分 ...

  9. Python入门(2)

    一.    基础语法 1.Print print 是 python 里很基本很常见的一个操作,它的操作对象是一个字符串. 直接在 print 后面加一段文字来输出的话,需要给文字加上双引号或者单引号. ...

  10. MySQL数据库web维护客户端管理工具

    TreeSoft数据库管理系统使用JAVA开发,采用稳定通用的springMVC +JDBC架构,实现基于WEB方式对 MySQL,Oracle,PostgreSQL 等数据库进行维护管理操作. 功能 ...