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 相关文章推荐
基于JQuery的简单实现折叠菜单代码
Sep 15 Javascript
jquery $.ajax()取xml数据的小问题解决方法
Nov 20 Javascript
javascript一元操作符(递增、递减)使用示例
Aug 07 Javascript
JQuery中attr方法和removeAttr方法用法实例
May 18 Javascript
JS前端笔试题分析
Dec 19 Javascript
js微信支付实现代码
Dec 22 Javascript
详解微信小程序 template添加绑定事件
Jun 23 Javascript
Node.JS更改Windows注册表Regedit的方法小结
Aug 18 Javascript
vue-cli的eslint相关用法
Sep 29 Javascript
详解javascript常用工具类的封装
Jan 30 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
Nov 25 Javascript
JS错误处理与调试操作实例分析
Apr 13 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
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
PHP 面向对象 PHP5 中的常量
2010/05/05 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
php日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
php页面消耗内存过大的处理办法
2013/03/18 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
Vue父组件调用子组件事件方法
2018/02/23 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
JS校验与最终登陆界面功能完整示例
2020/01/13 Javascript
Vue 数据绑定的原理分析
2020/11/16 Javascript
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
2019/06/27 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
2021/02/02 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
办公室主任主任岗位责任制
2014/02/11 职场文书
《巨人的花园》教学反思
2014/02/12 职场文书
就业推荐表自我鉴定
2014/03/21 职场文书
企业安全标语
2014/06/07 职场文书
邮政营业员岗位职责
2015/04/14 职场文书
春节慰问简报
2015/07/21 职场文书
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL