使用面向对象的技术创建高级JavaScript Web 应用程序(10)
作者:Ray Djajadinata 来源:Msdn 发布时间:2008-11-03 13:00:00
模拟私有属性
现在介绍闭包如何帮助模拟私有成员。正常情况下,无法从函数以外访问函数内的本地变量。函数退出之后,由于各种实际原因,该本地变量将永远消失。但是,如果该本地变量被内部函数的闭包捕获,它就会生存下来。这一事实是模拟 JavaScript 私有属性的关键。假设有一个 Person 类: 程序代码
function Person(name, age) {
this.getName = function() { return name; };
this.setName = function(newName) { name = newName; };
this.getAge = function() { return age; };
this.setAge = function(newAge) { age = newAge; };
}
参数 name 和 age 是构造函数 Person 的本地变量。Person 返回时,name 和 age 应当永远消失。但是,它们被作为 Person 实例的方法而分配的四个内部函数捕获,实际上这会使 name 和 age 继续存在,但只能严格地通过这四个方法访问它们。因此,您可以: 程序代码
var ray = new Person(“Ray”, 31);
alert(ray.getName());
alert(ray.getAge());
ray.setName(“Younger Ray”);
// Instant rejuvenation!
ray.setAge(22);
alert(ray.getName() + “ is now “ + ray.getAge() +
“ years old.”);
未在构造函数中初始化的私有成员可以成为构造函数的本地变量,如下所示: 程序代码
function Person(name, age) {
var occupation;
this.getOccupation = function() { return occupation; };
this.setOccupation = function(newOcc) { occupation =
newOcc; };
// accessors for name and age
}
注意,这些私有成员与我们期望从 C# 中产生的私有成员略有不同。在 C# 中,类的公用方法可以访问它的私有成员。但在 JavaScript 中,只能通过在其闭包内拥有这些私有成员的方法来访问私有成员(由于这些方法不同于普通的公用方法,它们通常被称为特权方法)。因此,在 Person 的公用方法中,仍然必须通过私有成员的特权访问器方法才能访问私有成员: 程序代码
Person.prototype.somePublicMethod = function() {
// doesn’t work!
// alert(this.name);
// this one below works
alert(this.getName());
};
Douglas Crockford 是著名的发现(或者也许是发布)使用闭包来模拟私有成员这一技术的第一人。他的网站 javascript.crockford.com 包含有关 JavaScript 的丰富信息,任何对 JavaScript 感兴趣的开发人员都应当仔细研读。


猜你喜欢
- 有一个 Selenium 脚本(Python),它点击回复按钮使anonemail类出现。anonemail 类出现的时间各不相同。因此,我
- 先来看看微信读书的效果实现思路这个效果比较简单,主要是旋转view,然后在旋转结束后更换view的背景,考虑到需要旋转view,所以使用动画
- 本文实例讲述了uwsgi+nginx部署Django项目操作。分享给大家供大家参考,具体如下:uWSGI概述uWSGI 是一个全功能的 HT
- Python 是面向对象的语言,所以程序抛出的异常也是类。常见的异常类1.NameError:尝试访问一个没有申明的变量2.ZeroDivi
- 众所周知,想要在python程序中执行SQL语句需要使用第三方模块:pymysql。下面,我将为大家简述一下pymysql第三方库的安装到使
- 知识点: 1、拼接SQL 2、UNION ALL 3、EXEC 其代码如下: 代码如下:--测试示例 declare @sql
- 你好,%用户名%!我叫Alex,我在机器学习和网络图分析(主要是理论)有所涉猎。我同时在为一家俄罗斯移动运营商开发大数据产品。这是我第一次在
- 问题Jupyter Notebook可以说是非常好用的小工具,但是不经过配置只能够在本机访问笔者参阅了文档对jupyter notebook
- 概述python开发过程中,我们可能需要同时开发多款应用,这些应用可能公用同一个版本的Python程序,但是使用不同版本的第三方库,比如A应
- 最近在做webIM,嵌入到OA系统,由于WEBIM处在独立页面,所以如果多次点击就会出现多个页面,这样在IE6下,服务器推送会认不到页面.所
- 以下公共方法支持列表,元组,字典,字符串。内置函数Python 包含了以下内置函数:函数描述备注len(item)计算容器中元素个数del(
- 这篇文章主要介绍了vue如何实现动态加载脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考
- 如下所示:a = int(input("请输入菱形行数:"))m = a #空格d = a #倒三角for i in r
- 概要相信很多像我一样初入门前端的时候,都是基于某个模板来学。 vue-element-admin 或者 vue-element-templa
- 昨日内容:ORM高级查询-filterid=3id__gt=3id__lt=3id__lte=3id__gte=3-in /not in.f
- 问题描述:使用指令 python -m pip install --upgrade pip 升级pip时,Pycharm报错:Attribu
- js原生获取css样式,并且设置,看似简单,其实并不简单,我们平时用的ele.style.样式,只能获取内嵌的样式,但是我们写的样式基本都在
- 1.什么是事务:事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时事务是做为最小的控制单元来使用的。他包含的所有数据库操作命令作
- 几个利用背景结合a:hover做的小东东,希望对大家有所帮助。<!DOCTYPE html PUBLIC "-//W3C//
- 在数据库中执行建表语句CREATE TABLE `sys_acl` ( `id` int(11) NOT NULL AUTO_INCREME