JavaScript 私有成员分析


Posted in Javascript onJanuary 13, 2009

对象
JavaScript操作都是关于对象的。数组(Array)是对象,函数(Function)是对象。Object(类型)是对象。那么什么是对象呢?对象就是“名称-值”对(name-value)。名称是字符串,值可以是字符串、数值、布尔值或对象(包括数组和函数)。对象经常用哈希表实现,所以取值速度很快。
如果对象的一个值是函数(function),我们可以认为它是成员函数,当成员函数被调用时,this变量就会指向该对象。成员函数可以通过this变量访问对象的成员。
对象可以通过构造器(constructor)生成,构造器是个初始化对象的函数。构造器在这里扮演了其他语言中“类”扮演的角色,也提供了定义static变量和方法的手段。
Public成员
对象的所有成员都是公开成员,谁都可以读写甚至删除这些成员或添加新成员。添加新成员有两种方法:
在构造器里添加
这通常被用来初始化公开的成员变量。利用构造器的this变量来把成员添加到对象里。
function Container(param)
{ this.member = param;}
用下面这行代码生成一个对象实例
var myContainer = new Container('abc');
myContainer的member成员值为'abc'。
在原型中添加
这种方法经常用来添加公开成员函数。当Javascrīpt解释器遇到一个对象的成员,发现对象自身中并不存在这个成员时,就会到对象构造函数 的原型中去找。原型机制可以用来实现继承。它同样占用内存。如果想要给某个构造函数生成的所有对象都添加一个方 法,只要给对象的原型添加这个方法就可以了。
Container.prototype.stamp = function (string) { return this.member + string;}
这样就可以调用这个成员函数
myContainer.stamp('def')
返回值'abcdef'。
私有成员
私有成员是在构造器里产生的。var定义的变量和构造器的参数会成为私有成员。
function Container(param){
this.member = param;
var secret = 3;
var that = this;
}
这个构造器定义了三个私有变量:param,secret和self。它们属性对象Container,而对象外的代码或是对象的公开方法都无法访问它们。
只有私有方法可以访问。私有方法是构造器内定义的函数。
function Container(param){
function dec() {
if (secret > 0)
{ secret -= 1; return true; }
else {
return false;
} }
this.member = param;
var secret = 3;
var that = this;}
私有方法 dec 检查实例变量 secret 的值,如果它大于0就减少它的值然后返回true;否则它返回false。
它可以用于限制这个对象只能被使用3次。
根据协议,我们定义了一个私有变量that,用来让私有方法可以访问对象本身。
这是一个变通的解决方案,需要它的根本原因在于ECMAscrīpt语言规范的一个错误,而这个错误导致内部函数的this变量有
错误。(honker:似乎不用that也没关系,也许是原文写得太早了,哪位高人遇到过这种问题?)
私有方法不能被公开方法调用。为了让私有函数有用,我们需要引入特权方法的概念。
特权
特权方法可以访问私有变量和方法,并且它本身可以被公开方法和外部访问。可以删除或替换一个特权方法但是不能改变它或强迫它放弃自己的秘密。
特权方法是在构造函数通过this定义的
function Container(param) {
function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
} }
this.member = param;
var secret = 3;
var that = this;
this.service = function () {
if (dec()) {
return that.member;
} else {
return null;
} };}
service是一个特权方法。前三次调用myContainer.service()将返回'abc',之后它将返回null。service调用私有的dec方法,dec方法访问私有的secret变量。service对其他对象和函数都是可见的,但我们不能直接访问private成员。
闭包
因为有了闭包的我,这些公开、私有和特权方法的写法才成为可能。它意味着内部函数总能访问它外层函数定义的变量和参数。即使外层函数已经返回。这是Javascrīpt的一个极其强大的特性。目前还没有如何一本Javascrīpt编程的书讲到如何利用它,大多都没有提到它。
私有和特权成员只能在对象被构造时生成。公开成员可以在任何时间添加。
写法
Public
function Constructor(...) {
this.membername = value;
}
Constructor.prototype.membername = value;
Private
function Constructor(...) {
var that = this;
var membername = value;
function membername(...) {...}
}
Note: The function statement
function membername(...) {...}
is shorthand for
var membername = function membername(...) {...};
Privileged
function Constructor(...) {
this.membername = function (...) {...};
}

Javascript 相关文章推荐
详解new function(){}和function(){}() 区别分析
Mar 22 Javascript
jQuery关于导航条背景切换效果实现示例
Sep 04 Javascript
javascript中的遍历for in 以及with的用法
Dec 22 Javascript
js点击选择文本的方法
Feb 09 Javascript
深入探究使JavaScript动画流畅的一些方法
Jun 30 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
Oct 20 Javascript
基于javascript实现右下角浮动广告效果
Jan 08 Javascript
原生js封装自定义滚动条
Mar 24 Javascript
一次围绕setTimeout的前端面试经验分享
Jun 15 Javascript
Easyui在treegrid添加控件的实现方法
Jun 23 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
Dec 13 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
Mar 28 Javascript
js利用Array.splice实现Array的insert/remove
Jan 13 #Javascript
JavaScript delete操作符应用实例
Jan 13 #Javascript
在网页里看flash的trace数据的js类
Jan 10 #Javascript
捕获关闭窗口的脚本
Jan 10 #Javascript
javascript 自动转到命名锚记
Jan 10 #Javascript
Javascript 生成指定范围数值随机数
Jan 09 #Javascript
Js 订制自己的AlertBox(信息提示框)
Jan 09 #Javascript
You might like
php在线打包程序源码
2008/07/27 PHP
PHP学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
Mac下快速搭建PHP开发环境步骤详解
2019/05/05 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
基于javascript实现全屏漂浮广告
2016/03/31 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
Python+微信接口实现运维报警
2016/08/27 Python
Python 运行 shell 获取输出结果的实例
2019/01/07 Python
python安装virtualenv虚拟环境步骤图文详解
2019/09/18 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
英国最大的运动营养公司之一:LA Muscle
2018/07/02 全球购物
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
房地产活动策划方案
2014/05/14 职场文书
员工廉洁自律承诺书
2014/05/26 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
机械生产实习心得体会
2016/01/22 职场文书
调解协议书范本
2016/03/21 职场文书
redis数据一致性的实现示例
2022/03/18 Redis