JavaScript中的私有成员 Javascript教程
作者:Douglas Crockford 发布时间:2008-12-02 17:57:00
翻译:ShiningRay @ Nirvana Studio
作者:Douglas Crockford
来源:http://www.crockford.com/
JavaScript 是世界上最被误解的语言。很多人认为它缺乏信息隐藏的特性所以对象不能有私有实例变量和方法。但这是一个误解。JavaScript对象同样可以拥有私有变量。
下面就讲解一下:对象
JavaScript根本上都是关于的对象(Object)的。数组(Array)是对象,函数(Function)是对象,Object就不说了。那什么是对象?对象是名称-值的配对的集合。名称是字符串,值可以是字符串、数字、布尔值和对象(包括数组和函数)。对象常常实现为哈希表以快速存取值。
如果一个值是函数,我们可以将它视为方法method。当调用一个对象的方法时,this 变量就会被设为该对象。这个方法就可以通过this变量访问实例变量。
对象是由构造器constructor产生的,它是初始化对象的函数。构造器提供了其它语言中类提供的特性,包括静态方法和变量。
公共成员
对象的成员都是 public 公共成员。任何函数都可以访问、修改或者删除这些成员。有两种主要的途径给新的对象加入成员:
构造器中
这个技术一般用来初始化公共实例变量。构造器的this变量是用来向对象添加成员的。
function Container(param) {
this.member = param;
}
这样,如果我们构造一个新的对象
var myContainer = new Container('abc');
那么myContainer.member 就会包含‘abc’。
原型中
这个技巧一般用来添加公共方法。当一个成员被检索且没有在对象中发现的时候,那么它就会从对象构造器的 prototype 成员中去获取它。这个原型机制可用来实现继承。它也可以节省内存。要为一个构造器生成的所有对象加入一个方法,将函数加入构造器的prototype 中:
Container.prototype.stamp = function (string) {
return this.member + string;
}
这样,我们可以调用这个方法
myContainer.stamp('def')
它会返回‘abcdef’.
私有成员
私有Private成员要由构造器生成。构造器中的普通的var变量和参数都成为私有成员。
function Container(param) {
this.member = param;
var secret = 3;
var self = this;
}
这个构造器有三个私有实例变量:param, secret, 和 self。它们被附加到了对象上,但它们无法从外部访问,同时它们也无法被这个对象的公共方法所访问。他们只对私有成员可见。私有方法则是构造器内部的函数。
function Container(param) {
function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
this.member = param;
var secret = 3;
var self = this;
}
私有方法 dec 检查 secret 实例变量。如果它大于0,就减少secret 的大小并返回 true 。否则它返回 false 。这个可以限制对象使用三次。
按照惯例,我们给出一个私有的 self 参数。这个可以令对象对私有方法可见。这种做法是因为ECMAScript Language Specification中的一个错误,这个错误令 this 不能正确地对内部函数设置。
私有方法无法被公共方法调用。要令私有方法有用,我们需要引入一种特权方法。


猜你喜欢
- 至此,我们的 Python零基础入门篇 的系列专栏到今天基本上算是结束了。今天没有任何的知识点,只是运用我们之前学习过的知识做两个小游戏的案
- 事务处理在各种管理系统中都有着广泛的应用,比如人员管理系统,很多同步数据库操作大都需要用到事务处理。比如说,在人员管理系统中,你删除一个人员
- 问题描述: 有2个数组如下a = [3,3,3,4,4,4,5,6,7]b = [3,3,4,4]第1题:从数组a中删除所有在数组b中出现过
- bootstrap.js的大概1154行:this.$element.css({ paddingLeft: !this.bod
- 下面是最终代码 (windows下实现的) # -*- coding: cp936 -*- import os path = 'D:
- 布尔类型是PHP中 最简单的类型。它的值可以为 TRUE 或 FALSE。如:$foo=false;$foo1=true;echo &quo
- MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQLAB公司,在2008年1月16号被Sun公司收购。MySQL被广泛地应用在I
- python序列类型包括哪三种python序列类型包括:列表、元组、字典列表:有序可变序列创建:userlist = [1,2,3,4,5,
- 今天想围绕“产品交互设计”说说一些我们的想法,一说到产品设计,我想在坐的各位脑海里肯定联想到了很多表单设计、导航设计、界面布局等等,但是今天
- 本文实例为大家分享了python实现人机五子棋的具体代码,供大家参考,具体内容如下图形界面引用PyQt5,还有socket通信。可以局域网对
- 本文实例讲述了Python装饰器(decorator)定义与用法。分享给大家供大家参考,具体如下:什么是装饰器(decorator)简单来说
- 一般情况下,mysql会默认提供多种存储引擎,可以通过下面的查看:1)查看mysql是否安装了innodb插件。通过下面的命令结果可知,已经
- 前言在使用Python进行网络编程或者爬取一些自己感兴趣的东西时,总避免不了进行一些数据传输、存取等问题,Python的文件对象以及其他扩展
- 这篇文章主要介绍了python获取网络图片方法及整理过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 说明:这个例子,首先是把SPAN里的内容用display:none;干掉,就是不显示; 然后在A:HOVER时,再把SPAN里的内容disp
- 生成静态页的页面非常的简单就是定义好模板与模板标题,之后利用str_replace进行替换了,是最常用的方法,另一种是利用ob_get_co
- RabbitMQ 6种工作模式对RabbitMQ 6种工作模式(简单模式、工作模式、订阅模式、路由模式、主题模式、RPC模式)进行场景和参数
- 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考。具体代码如下:from optparse i
- 摘要:本文主要是在pandas中如何对字符串进行切分。我们考虑一下下面的应用场景。这个是我们的数据集(data),可以看到,数据集中某一列(
- 问题联邦学习原始论文中给出的FedAvg的算法框架为:参数介绍: K 表示客户端的个数, B表示每一次本地更新时的数据量, E 表示本地更新