JavaScript 私有成员分析

对象
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 (...) {...};
}

(0)

相关推荐

  • JavaScript 面向对象的之私有成员和公开成员

    上两节讲了 JavaScript 面向对象之命名空间 与 javascript 面向对象的JavaScript类,大家可以先看上面的再继续往下看. 其实很简单,废话少说,看了下面的代码及注释相信你就会一目了然! 复制代码 代码如下: //声明类,就是一个方法,其实在JavaScript中,命名空间.类.成员.... 一切皆对象 MyClass =function(){ var _this=this; //私有变量 var aa="11"; //公开变量 this.bb="22

  • javascript中的void运算符语法及使用介绍

    void是javascript中的一个操作符,语法如下: javascript:void(表达式) javascript:void 表达式 void会计算表达式的值,但是会丢弃表达式的返回值. 这个表达式常常用来使链接变成一个死链接: 复制代码 代码如下: <a href = "javascript:void(0)" onclick = "func()">点我</a> 当点击这个链接的时候,不会发生地址跳转,而执行onclick函数. 下面的

  • JavaScript 面向对象的 私有成员和公开成员

    其实很简单,废话少说,看了下面的代码及注释相信你就会一目了然! 复制代码 代码如下: //声明类,就是一个方法,其实在JavaScript中,命名空间.类.成员.... 一切皆对象 MyClass =function(){ var _this=this; //私有变量 var aa="11"; //公开变量 this.bb="22"; //私有方法 function fun1(){ alert(aa); alert(_this.bb); } //私有方法 var f

  • 基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式

    前言 在面向对象的编程范式中,封装都是必不可少的一个概念,而在诸如 Java,C++等传统的面向对象的语言中, 私有成员是实现封装的一个重要途径.但在 JavaScript 中,确没有在语法特性上对私有成员提供支持, 这也使得开发人员使出了各种奇技淫巧去实现 JS 中的私有成员,以下将介绍下目前实现 JS 私有成员特性的几个方案以及它们之间的优缺点对比. 现有的一些实现方案 约定命名方案 约定以下划线'_'开头的成员名作为私有成员,仅允许类成员方法访问调用,外部不得访问私有成员.简单的代码如下:

  • javascript中基于replace函数的正则表达式语法

    示例代码如下: var strM = "javascript is a good script language"; //在此我想将字母a替换成字母A alert(strM.replace("a","A")); [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 它只替换了首字母.但如果加上正则表达式结果就不一样了!replace()支持正则表达式,它可以按照正则表达式的规则匹配字符或字符串,然后给予替换! 注意:被替换的部分不用加双引号

  • javascript新手语法小结

    新手入学时常学到的东西~ <script language="javascript">alert('badwolf测试!');</script> //弹提示 <script language="javascript">alert('呵呵!');</script> //弹提示 <script language="javascript">alert(new Date());</scri

  • JavaScript 高级语法介绍

    (function($){})(jQuery); 其实比较简单,要理解几个概念: 1.(),在JavaScript里()表示执行一个方法,如: function x(){ alert("xxx"); } var a = x;   // 没有调用,a 是一个function var a = x(); //调用了函数,a 的值是调用的结果:undefined 2.jQuery是一个jQuery对象,表示调用函数时,传入一个参数是jQuery对象. 这个没什么好说的 3.(function(

  • JavaScript中的私有成员

    JavaScript是世界上是被误解得最厉害的编程语言.有些人认为它不具备"信息隐藏"的能力,因为JavaScript的对象没有私有变量和方法.这是误解.JavaScript对象可以拥有私有成员,下面我们来看看怎么做.(SharkUI.com注:JavaScript并不是真正拥有私有.公有等等OOP的特性,这篇译文中提到的这些私有.公有.特权等特性,是利用JavaScript的其他特性(参看本文的"闭包"一节)"模拟"出来的.感兴趣的话可以搜索相

  • 正则表达式语法规则及在Javascript和C#中的使用方法

    一.正则表达式概念: 在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容.许多程序设计语言都支持利用正则表达式进行字符串操作. 二.正则表达式的使用: 正则表达式在ASP.NET中主要是用来对输入的内容进行验证,验证一般分为两种一种是客户端JS验证,另一种是服务器端验证 1.JS对输入内容验证 复制代码 代码如下: function check() {           

  • 9个javascript语法高亮插件 推荐

    下面介绍的是一些纯javascript实现的语法高亮插件. 英文原文:http://www.webdesignbooth.com/9-useful-javascript-syntax-highlighting-scripts/ 1. SyntaxHighlighter我相信这个插件是我们使用多的,它支持超多的语言,如果遇到不支持的语法还支持自定义. 2. SHJSSHJS 是js语法高亮插件的代表,它支持很多编程语言,兼容Firefox 2 &3, IE 6 & 7, Opera 9.6,

  • Javascript类定义语法,私有成员、受保护成员、静态成员等介绍

    其实通俗的讲类就是对象的模板,为了增强JS的OO特性,受mootoos框架启发我们可以使用一个JSON对象来描述这个对象的模板.在这个模板中我们可以模拟实现私有成员,受保护成员,静态成员. 这是一个在JS中模拟的类定义语法,代码中Class是一个自定义函数,它接受两个参数,第一个参数是类名.第二个参数是一个JSON用来一个对象的模板.在这个JSON对象中其中字段 "extend",,"initialize","static" 为一些预定义关键字,

  • 教你如何在 Javascript 文件里使用 .Net MVC Razor 语法

    相信大家都试过在一个 View 里嵌套使用 javascript,这时就可以直接使用 Razor 语法以调用 .NET 的一些方法.如以下代码嵌套在一个 Razor 的 View 里: <script> var currDate = '@DateTime.Now'; //直接调用.NET的方法 console.log(currDate) </script> 但另一种情况是,如果我想在一个独立的 JS 文件里使用 Razor,那以上的方法可行不通,因为MVC不会直接解释JS文件,只有

  • JavaScript学习笔记(一) js基本语法

    1.标识符与关键字 标识符以字母开头,可以包含字母.数字.下划线.标识符不能使用以下保留字符: 复制代码 代码如下: abstract, boolean, break,byte,case,catch,char,class,const,debugger,default,delete,do,double,else,enum,export,extends,false,final,finally,float,for,function,goto,if,implements,import,in,instan

  • JavaScript建立一个语法高亮输入框实现思路

    textarea元素已被广泛用于网页Web的IDE.通常网站自带的textarea编辑器不能满足我们的需求,作为一名开发者我们经常需要进行代码的在线编辑,高亮显示代码等,因此,通过其他的开源项目,我们可以添加一些实用的功能, 在这篇文章中,我将使用JavaScript库ACE来创建一个输入框效果.这是一个完全开源的脚本.该脚本允许开发人员创建支持语法高亮的输入框.然后你可以代码嵌入到网站中的任何地方 下载库 首先我们需要Github上下载ACE代码. 下载完成后解压缩,在你的header部分引入

  • javascript编程必备_JS语法字典第1/2页

    1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5.得到表单中元素的名称和值:document.getElementById("表单中元素的ID号").name(或value) 6.一个小写转大

  • JavaScript语法着色引擎(demo及打包文件下载)

    应 得意小蛇 的建议,我整理了一下去年写的JavaScript语法着色引擎,并提供下载,喜欢的尽管拿去,嘿嘿 总的来说是很简单的东西,只是提供了关键字的着色以及一些基本的语法(例如注释,字符串,正则等等),从demo中应该很容易看到其用法,这里简单介绍下: 类名:Lighter 通过new Lighter()可以得到一个着色引擎实例,假设为lighter,有以下属性和方法: 语言属性:lighter.language 这个属性的范围是可以根据语法文件的数量自己添加的,提供的demo中有'cpp'

  • javascript 语法基础 想学习js的朋友可以看看

    1:javascript区分大小写 2:javascript每一条语句必须以";"结束,与C语言一样 3:输出:document.write("字符串")--->还可以输出对应的html标记 4:改变窗体的颜色document.bgColor="red"; 4:类型转换:parseInt,parseFloat 5:随机函数:parseInt(Math.random()*90+10) 产生10--100的随机数 5:弹出对话框:alert(&

  • 12种不宜使用的Javascript语法整理

    1.== Javascript有两组相等运算符,一组是==和!=,另一组是===和!==.前者只比较值的相等,后者除了值以外,还比较类型是否相同. 请尽量不要使用前一组,永远只使用===和!==.因为==默认会进行类型转换,规则十分难记.如果你不相信的话,请回答下面五个判断式的值是true还是false: false == 'false' false == undefined false == null null == undefined 0 == '' 前三个是false,后两个是true.

  • javascript基本语法分析说明

    在phpchina学PCTI前几天教了css与javascript先给大家看看 javascript的标识符 标识符是指javascript中定义的符号 比如变量名,函数名,数组名等等. 标识符可以由任意顺序的大小写字母,数字,下划线和美元符号组成,标识符不能以数字开头,也是不能使用javascript中的保留关键字. javasceipt严格区分大小写,每条功能执行后以分号结束,每个词之间用空格.制表符.换行符或大括号.小括号这样的分隔符隔开. ~~~~~~~~以上部分虽然有些唠叨,但是是需要

随机推荐