【转】JavaScript面向对象程序设计(6): 封装
封装是面向对象的重要概念之一。如果一个程序没有封装性,也就谈不上什么面向对象。但是,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): 封装相关推荐
- JavaScript中的面向对象程序设计
本文内容目录顺序: 1.Object概念讲述: 2.面向对象程序设计特点: 3.JavaScript中类和实例对象的创建: 4.原型概念: 5.原型API: 6.原型对象的具体使用:7.深入理解使用原 ...
- 全方位深入理解JavaScript面向对象
JavaScript面向对象程序设计 本文会碰到的知识点: 原型.原型链.函数对象.普通对象.继承 读完本文,可以学到 面向对象的基本概念 JavaScript对象属性 理解JavaScript中的函 ...
- JavaScript面向对象编程深入分析
JavaScript面向对象编程深入分析 一. Javascript 面向对象编程:封装 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又 ...
- 《JavaScript高级程序设计》笔记总结
在北京上班的我每天在上下班路上的时间总共是两个半小时,为了充实这两个多小时的时间,我便花了银子换得了下面这个宝贝 本书内容(引用书中前言) 本书提供了JavaScript开发人员必须掌握的内容,全面涵 ...
- C++面向对象程序设计教程
前言 全篇使用标题+代码的形式,知识点的介绍写在代码部分的注释里.书籍为<C++面向对象程序设计教程(第四版)>(陈维兴 林小茶 编著). 第一章为基础概念,过于简单:第七章为输入输出流, ...
- JavaScript高级程序设计第三版.CHM【带实例】
从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...
- Javascript 面向对象全新理练之数据的封装
JavaScript 是一种非常灵活的面向对象程序设计语言,它与传统的强类型的面向对象程序设计语言(如 C++,Java,C# 等)有很大不同,所以要实现如 C++.java.C# 当中的一些特性就需 ...
- Javascript 面向对象编程(一):封装 ——转自阮一峰博客
Javascript 面向对象编程(一):封装 作者: 阮一峰 日期: 2010年5月17日 学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的 ...
- 为 javascript 面向对象编程封装
javascript 是一个基于对象的脚本语言,不是一个真正的面向对象的脚本语音,因此javascript的面向对象纯属于鸡肋. 不过还好,javascript是一个非常灵活的语言.有很多间接的方式实 ...
- 《JavaScript面向对象精要》——1.8 原始封装类型
本节书摘来自异步社区<JavaScript面向对象精要>一书中的第1章,第1.8节,作者:[美]Nicholas C. Zakas 译者: 胡世杰 更多章节内容可以访问云栖社区" ...
最新文章
- 面部表情视频中进行远程心率测量:ICCV2019论文解析
- ISP【二】————camera ir图
- 高效率开发必备!!!!
- python用途与前景-Python 就业方面的选择与应用分析
- 洛谷 P1101 单词方阵
- 第五章、寻找满足条件的两个或多个数
- 【我拼搏的2016】-苦逼运维如何变身为SRE成长经历
- 字节数组转jsonobject(如读取HttpServletRequest.inputstream到jsonobject)
- 基本的排序算法php,php四种基础排序算法
- leetcode题解108-将有序数组转换为二叉排序树
- C#开发微信门户及应用(13)-使用地理位置扩展相关应用
- 搭建nfs共享存储服务之三客户端配置
- Linux 初级命令
- IOS开发之-人脸识别
- 世界第4疯狂的科学家,在103岁生日那天去世了
- 如何更改域计算机用户名和密码错误,win7加入域失败:未知的用户名或密码错误 | 绿萝...
- am57xx Damo根文件加载过程
- Android游戏开发教程汇总
- win10sas安装教程_win10s是什么版本_windows10s版本的特性图文教程
- mail.yahoo.com.cn:yahoo邮箱用outlook无法发信问题的解决办法