封装是面向对象的重要概念之一。如果一个程序没有封装性,也就谈不上什么面向对象。但是,JavaScript并不像其他的语言,比如Java,有公有变量和私有变量等;在JavaScript中只有一种作用域:公有作用域。在本章中,我们将会见识到JavaScript是如何实现封装的特性的。

1. this和公有变量
首先需要理解this关键字。看下面的一段代码,你应该对此感到熟悉:

function Person(name, age) { this.name = name; // 定义一个公有变量 this.age = age; this.show = function() { // 定义一个公有函数 alert("name: " + name + "; age: " + age); }
}
var bill = new Person("Bill", 20);
alert(bill.name);
bill.show(); 

这里的this关键字是必不可少的。前面只是让大家记住,那么为什么要这样呢?想想JavaScript的对象,JavaScript的对象类似于散列,一个<string, object>键-值对的集合。这里的对象的属性实际上都是离散的,并不像其他的语言那样绑定到一个对象上面。this关键字指代的是属性或者函数的调用者,也就是说,谁调用这个属性或者函数指的就是谁。可以看到,这里的this和Java或者C++的this是有所不同的,后者的this是指属性或者函数所在的那个对象本身。而这里this的作用就是将它后面跟着的属性或者对象绑定到调用者上面。回忆一下JavaScript的new的过程,首先将创建一个空的对象,然后使用构造函数初始化这个对象,最后返回这个对象。在这个过程中,JavaScript将把this用这个对象替换,也就是把对象和这些属性或函数相关联,看上去就像是这个调用者拥有这个属性或者函数似的,其实这是this的作用。

这样看来,show里面的name和age并没有关键字,但也是可以正常的执行就会明白怎么回事了——因为前面已经用this把name和age与这个对象bill相关联,并且,show也关联到这个bill变量,因此JavaScript是可以找到这两个变量的。

这样来看,似乎由this修饰的都是公有变量。事实确实如此,如果你要使一个变量成为公有变量,可以使用this。像上面代码中的name和age都是公有变量,在外面使用aPerson.name或者aPerson.age就可以访问到。
2. 私有变量
怎么声明一个私有变量呢?事实上就像前面说的,JavaScript根本没有私有作用域这一说。那么来看下面的代码:

function Person(name, age) { var name = name; // 私有属性 var age = age; var show = function() { // 私有函数 alert("name: " + name + "; age: " + age); }
}
var bill = new Person("Bill", 20);
alert(bill.name); // undefined
bill.show(); // error, 不存在 

这段代码和前面几乎是相同的,只是把属性前面的this换成了var。我们知道,var是用来声明变量的。show函数和bill.name都是未定义!这是怎么回事呢?

回忆一下前面说过的JavaScript的new的过程。由于name和age都是使用var声明的,JavaScript会将它看作是一个普通的变量,这样在构造初始化结束之后,构造函数就返回了,变量因超出作用域而访问不到。也就是说,我们使用JavaScript变量作用域模拟了私有属性。

3. 静态变量

静态变量是绑定到类上面的。对于不同的对象来说,它们共享一个静态变量。

Person.num = 0; // 静态属性
function Person() { this.show = function() { alert("num: " + Person.num); }; Person.num++;
}
var bill = new Person();
bill.show(); // 1
var tom = new Person();
tom.show(); // 2
bill.show(); // 2 

在JavaScript中可以很方便的添加静态属性,因为JavaScript的对象就是散列,所以只要简单的在类名后添加一个属性或者函数即可。

4. 访问私有变量和公有变量
当对私有变量进行访问时,只需要使用变量的名字就可以了,但是,如果要访问公有变量,则需要使用this关键字。

function Person(name, age) { this.myName = name; var myAge = age; this.show = function() { alert("show = name: " + this.myName + "; age: " + myAge); } var showAll = function() { alert("showAll = name: " + this.myName + "; age: " + myAge); }
}
var bill = new Person("Bill", 20);
bill.show(); 

在这里,如果去掉myName的this关键字,就会有未定义属性的错误。

简单来说,我们需要使用this来声明公有变量,使用var来声明私有变量。但是,JavaScript却不是那么简单,因为JavaScript是一个脚本语言,我们需要十分关心它的执行效率。下面,我们将会看一下JavaScript面向对象设计的最佳实践

【转】JavaScript面向对象程序设计(6): 封装相关推荐

  1. JavaScript中的面向对象程序设计

    本文内容目录顺序: 1.Object概念讲述: 2.面向对象程序设计特点: 3.JavaScript中类和实例对象的创建: 4.原型概念: 5.原型API: 6.原型对象的具体使用:7.深入理解使用原 ...

  2. 全方位深入理解JavaScript面向对象

    JavaScript面向对象程序设计 本文会碰到的知识点: 原型.原型链.函数对象.普通对象.继承 读完本文,可以学到 面向对象的基本概念 JavaScript对象属性 理解JavaScript中的函 ...

  3. JavaScript面向对象编程深入分析

    JavaScript面向对象编程深入分析 一. Javascript 面向对象编程:封装 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又 ...

  4. 《JavaScript高级程序设计》笔记总结

    在北京上班的我每天在上下班路上的时间总共是两个半小时,为了充实这两个多小时的时间,我便花了银子换得了下面这个宝贝 本书内容(引用书中前言) 本书提供了JavaScript开发人员必须掌握的内容,全面涵 ...

  5. C++面向对象程序设计教程

    前言 全篇使用标题+代码的形式,知识点的介绍写在代码部分的注释里.书籍为<C++面向对象程序设计教程(第四版)>(陈维兴 林小茶 编著). 第一章为基础概念,过于简单:第七章为输入输出流, ...

  6. JavaScript高级程序设计第三版.CHM【带实例】

    从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...

  7. Javascript 面向对象全新理练之数据的封装

    JavaScript 是一种非常灵活的面向对象程序设计语言,它与传统的强类型的面向对象程序设计语言(如 C++,Java,C# 等)有很大不同,所以要实现如 C++.java.C# 当中的一些特性就需 ...

  8. Javascript 面向对象编程(一):封装 ——转自阮一峰博客

    Javascript 面向对象编程(一):封装 作者: 阮一峰 日期: 2010年5月17日 学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的 ...

  9. 为 javascript 面向对象编程封装

    javascript 是一个基于对象的脚本语言,不是一个真正的面向对象的脚本语音,因此javascript的面向对象纯属于鸡肋. 不过还好,javascript是一个非常灵活的语言.有很多间接的方式实 ...

  10. 《JavaScript面向对象精要》——1.8 原始封装类型

    本节书摘来自异步社区<JavaScript面向对象精要>一书中的第1章,第1.8节,作者:[美]Nicholas C. Zakas 译者: 胡世杰 更多章节内容可以访问云栖社区" ...

最新文章

  1. 面部表情视频中进行远程心率测量:ICCV2019论文解析
  2. ISP【二】————camera ir图
  3. 高效率开发必备!!!!
  4. python用途与前景-Python 就业方面的选择与应用分析
  5. 洛谷 P1101 单词方阵
  6. 第五章、寻找满足条件的两个或多个数
  7. 【我拼搏的2016】-苦逼运维如何变身为SRE成长经历
  8. 字节数组转jsonobject(如读取HttpServletRequest.inputstream到jsonobject)
  9. 基本的排序算法php,php四种基础排序算法
  10. leetcode题解108-将有序数组转换为二叉排序树
  11. C#开发微信门户及应用(13)-使用地理位置扩展相关应用
  12. 搭建nfs共享存储服务之三客户端配置
  13. Linux 初级命令
  14. IOS开发之-人脸识别
  15. 世界第4疯狂的科学家,在103岁生日那天去世了
  16. 如何更改域计算机用户名和密码错误,win7加入域失败:未知的用户名或密码错误 | 绿萝...
  17. am57xx Damo根文件加载过程
  18. Android游戏开发教程汇总
  19. win10sas安装教程_win10s是什么版本_windows10s版本的特性图文教程
  20. mail.yahoo.com.cn:yahoo邮箱用outlook无法发信问题的解决办法

热门文章

  1. 哈 佛 大 学 图 书 馆 训 言
  2. html 毛笔书写效果,canvas 手写毛笔字效果
  3. 转:MySQL 的 my.cnf 文件(解决 5.7.18 下没有 my-default.cnf )
  4. centos 解压压缩包到指定目录
  5. 网络流媒体(七)———PTSP
  6. Tracup|使用项目管理软件帮助战胜拖延症
  7. IPhone4S自定义铃声
  8. 微信小程序自定义标题栏
  9. 珀莱雅:融资净买入201.72万元,融资余额2.52亿元
  10. 我们不生产知识,我们只是知识的搬运工