`
baby69yy2000
  • 浏览: 183237 次
  • 性别: Icon_minigender_1
  • 来自: 自己输入城市...
社区版块
存档分类
最新评论

[转]Javascript类中的私有变量和静态方法

    博客分类:
  • JS-1
阅读更多
转自:http://v1.djasp.net/static/zh/2055.stm

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 不能正确地对内部函数设置。 
私有方法无法被公共方法调用。要令私有方法有用,我们需要引入一种特权方法。 
特权成员 
一个特权A privileged 方法可以访问私有的变量和方法,同时它对公共域可见。也可以删除或替换一个特权方法,但不能改变它。 
特权方法是用 this 在构造器中分配的。 
function Container(param) { 

    function dec() { 
        if (secret > 0) { 
            secret -= 1; 
            return true; 
        } else { 
            return false; 
        } 
    } 

    this.member = param; 
    var secret = 3; 
    var self = this; 

    this.service = function () { 
        if (dec()) { 
            return self.member; 
        } else { 
            return null; 
        } 
    }; 
}
service 就是一个特权方法。
前三次调用会返回’abc’。之后 ,它会返回 null。service调用的私有的 dec 方法,而 dec又访问了私有的 secret变量。service对其它的对象和方法是可见的,但不能直接访问私有成员。 
闭包 
这种公共、私有和特权成员的模式是可行的原因是由于JavaScript有 closure闭包。这个意味着一个内部的函数总是可以访问这个函数外部的变量和参数,甚至在外部的函数返回之后。这是这个语言的一个极其强大的特性。目前没有哪本关于JavaScript编程的书展示了如何发掘这个特性。大多数都没有提到。 
私有和特权成员只能在对象构造的时候生成。公共成员可以在任意时刻添加。 
模式 
公共(Public) 
function Constructor(...) { 
    this.membername = value; 
} 
Constructor.prototype.membername = value;私有(Private) 
function Constructor(...) {   
    var self =  this; 
    var membername =  value;   
    function  membername(...)  {...} 
}注意,实际上函数语句  
function  membername(...)  {...} 
是以下语句的缩写,两者相同:  
var  membername = function  membername(...)  {...};特权(Privileged) 
function Constructor(...) {   
    this.membername =  function (...)  {...}; 
} 


分享到:
评论

相关推荐

    JavaScript面向对象之私有静态变量实例分析

    本文实例分析了JavaScript面向对象之私有静态变量。分享给大家供大家参考,具体如下: 大家知道,私有实例变量的原理是根据作用域。 私有实例变量是在Javascript的function内部用var关键字实现,只在function内部...

    JavaScript中的私有/静态属性介绍

    •模拟块级作用域 大家都知道在JavaScript中没有块级作用域的概念,我们可以通过使用闭包来模拟实现块级作用域,看下面的示例: 代码如下: (function () { for (var i = 0; i < 10; i++) { //Do Nothing } alert&...

    Javascript 类与静态类的实现

    今天所要说的就是,如何在Javascript里写类与静态类,这是本人一惯用的方法,你也可以有更为方便的,也可以发发评论跟大家交流交流。 首先说说类,在一个类里我们会有以下的几个特征: 1. 公有方法 2. 私有方法 3. ...

    JavaScript模式中文[pdf] 百度云

     私有属性和方法  模块模式  沙箱模式  静态成员  对象常量  链模式  method()方法  小结  第6章 代码复用模式  传统与现代继承模式的比较  使用类式继承时的预期结果  类式继承模式#1——默认模式  类...

    面向对象javascript笔记

    面向对象的 javascript 学习 大家好,根据我的学习经验总结了下面一些javascript面向对象方法的知识,希望对一些...闭包,上下文,公共方法和私有方法,公共变量私有变量,特权方法,静态方法,命名空间,编码建议

    JavaScript模式 斯托扬·斯特凡洛夫 著

    私有属性和方法 模块模式 沙箱模式 静态成员 对象常量 链模式 method()方法 小结 第6章 代码复用模式 传统与现代继承模式的比较 使用类式继承时的预期结果 类式继承模式#1——默认模式 类式继承模式#2——借用构造...

    学生信息管理系统(实现增删改查操作)Java+Servlet+HTML+CSS+数据库

    实体类的数据初始化(添加私有变量、有参/无参构造、get/set方法、toString() 方法重写) 完成数据表创建 三层架构的搭建(dao层接口和实现类的编写、service层接口和实现类的编写、view层的Servlet类的编写)

    JavaScript,一个Class对象,数据集的增删改查list操作(纯js版)

    类似java面向对象风格的一个完整js类{构造方法,类成员变量,私有|公开静态变量,静态方法,类成员方法},从new一个对象开始,最终对一个list进行增删改查,希望能帮助到大家!! 里面包含测试mian(),详细记录了...

    Coffeescript中文手册

    私有变量 31 CoffeeScript的自动编译 32 Cake 32 Server端的支持 35 创建应用程序 36 结构 & CommonJS 36 导入文件 37 暴露属性 37 使用Stitch打包 38 JavaScript模板 41 附加-使用Heroku 30秒快速发布 44 其他类库 ...

    JavaScript中原型和原型链详解

    主要介绍了JavaScript中原型和原型链详解,本文讲解了私有变量和函数、静态变量和函数、实例变量和函数、原型和原型链的基本概念,需要的朋友可以参考下

    JavaScript中的面向对象介绍

    在其它面向对象语言中对象是由类的实例化而来,JavaScript是基于原型的面向对象语言,没有类的概念,对象派生自现有对象的副本对象创建对象构造函数公有、私有、特权、静态成员this、call和apply异常处理继承原型...

    javascript 静态对象和构造函数的使用和公私问题

    先看: 代码如下: var objJson={ op1:’objJson option1′, fn1:function(){ alert(this.op1) } } 在这种形式的声明下,你可以通过objJson.op1或者objJson.fn1()来直接访问内部的属性,这没有问题。...

    asp.net知识库

    利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 卸载Class? Web Form 窗体 如何实现web...

Global site tag (gtag.js) - Google Analytics