JavaScript中闭包实现的私有属性的getter()和setter()方法
注意:
以下的输出都在浏览器的控制台中
<!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()方法的更多相关文章
- [转载]Python使用@property装饰器--getter和setter方法变成属性
原贴:为什么Python不需要getter和setter getter 和 setter在java中被广泛使用.一个好的java编程准则为:将所有属性设置为私有的,同时为属性写getter和sette ...
- 字段是字段,属性是属性,字段不是属性,属性看getter或setter
1.看图猜字段和属性 2.结果是一个属性[字段麻,太明目张胆啦,就是2啦],又是哪个属性能够显示出来呢? 3.这是为什么呢? 让我们回到javabean的课堂~~~ ★ javaBean中的prope ...
- 在Javascript中闭包(Closure)
在Javascript中闭包(Closure) 什么是闭包 “官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. ...
- javascript中闭包最简单的简绍
javascript中闭包是什么 JavaScript 变量可以是局部变量或全局变量.私有变量可以用到闭包.闭包就是将函数内部和函数外部连接起来的一座桥梁. 函数的闭包使用场景:比如我们想要一个函数来 ...
- JavaScript中易混淆的DOM属性及方法对比
JavaScript中易混淆的DOM属性及方法对比 ParentNode.children VS Node.prototype.childNodes ParentNode.children:该属性继承 ...
- 在JavaScript中闭包的作用和简单的用法
在JavaScript中闭包的作用和简单的用法 一.闭包的简介 作用域链:在js中只有函数有作用域的概念,由于函数内能访问函数外部的数据,而函数外部不能访问函数内部的数据,由上述形成一种作用域访问的链 ...
- JavaScript中四种不同的属性检测方式比较
JavaScript中四种不同的属性检测方式比较 1. 用in方法 var o = {x:1}; "x" in o; //true "y" in o; //fa ...
- 使用 JavaScript 中的 document 对象的属性,根据下拉框中选择的属性,更改页面中的字体颜色和背景颜色
查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的 document 对象的属性,根据下拉框中选择的属性,更改页面中的字体颜色和背景颜色 实现思路: 在页面的 <body&g ...
- 对象存取器属性:getter和setter
在一个对象中,操作其中的属性或方法,通常运用最多的就是读(引用)和写了,譬如说o.a,这就是一个读的操作,而o.b = 1则是一个写的操作.事实上在除ie外最新主流浏览器的实现中,任何一个对象的键值都 ...
随机推荐
- springboot 1.5.2 thymeleaf 添加templates 静态资源访问路径
从velocity 模板切换到thymeleaf 后, 默认模板位置为templates , 有时候静态资源方在该目录下会出现访问404错误 解决办法: application.properties ...
- ECS_8080端口连接拒绝问题排查
原文链接 用户ECS网络设置 上图是用户ECS的网络示意图: ecs处于vpc网络下 ecs加入了一个安全组,该安全组出入方向均开放8080端口 ecs有两个网卡,一个私网主网卡(有虚线的网卡),一个 ...
- Java IO流之缓冲流
一.缓冲流简介 二.BufferedInputStream 三.其他三种缓冲流
- 史上最完整Hadoop2.x完全分布式安装部署-小白也能学会
一.环境要求: 1. 虚拟机安装并设置网络: 2. 修改主机地址映射: 3. 必备软件:Jdk.Development Tools Development ...
- Web前端性能优化全攻略
网页制作poluoluo文章简介:Web 前端性能优化是个大话题,是个值得运维人员持续跟踪的话题,是被很多网站无情忽视的技术. Web 前端性能优化是个大话题,是个值得运维人员持续跟踪的话题,是被很多 ...
- windows8.1安装之后的感想
这蛋疼的换了系统之后,发现windows8在界面方面确实花了不少功夫,但是自我感觉,比较适合触屏的平板电脑用. 我笔记本操作体验一般般.windows8不吃内存.这是真的.我机子占了25%左右.刚 ...
- Django Nginx反代 获取真实ip
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Andale Mono"; color: #28fe14; backgr ...
- socket套接字编程
一.概述 1.socket是一种进程间通信方式,既可以用于一台机器,也可以用于网络.常用语C/S模型. 2.可以跨越Windows和Linux操作系统,可以跨越不同语言. 3.注意网络字节序和主机字节 ...
- 基于C#的接口自动化测试(一)
其实就是找个地方然后给关键的代码做个笔记什么的-- 字符串访问API接口,访问方法为POST: string url = URL; string RequestParam = Param; strin ...
- win10 搜索不能使用解决方法
重装系统之后遇到一个问题,在搜索栏不能搜索到应用程序,Windows 10 Search can't find ANY applications. Even calculator - Super Us ...