JavaScript公有、私有以及受保护的属性和方法
来源:互联网 发布:淘宝开店交税吗 编辑:程序博客网 时间:2024/05/05 19:47
在某些情景下,你可能希望限制某些属性和方法的暴露程度,使他们不能通过对象实例本身被访问、修改或调用。许多传统语言可以将属性和方法定义为公有、私有或者受保护的。私有变量或方法在类定义之外不能被进行读写;受保护的变量不能被直接访问;但可以通过一个包装方法对其读写。在JS中并没有具体的语法来定义私有或受保护的变量和方法,不过我们可以对声明“类”的方法做一些改变,从而限制对属性和变量的访问。
在构造函数中通过var定义的变量其作用域局限于该构造函数内——在prototype上定义的方法无法访问这个变量,因为这些方法有其自己的作用域。想要通过公有的方法来访问私有的变量,需要创建一个包含两个作用域的新作用域。为此,我们可以创建一个自我执行的函数,称为闭包。代码如下。
JavaScript有一个非强制的但很有用的编程惯例,就是对所以私有变量或函数名加一个下划线(_)作为前缀,以标识他们是私有的。
var Accommodation = (function(){ function Accommodation(){} //此处定义的所有变量都是私有的 var _isLocked = false, _isAlarmed = false, _alarmMessage = "Alarm actiated!"; //**仅在当前作用域中定义的函数(未在构造函数原型上定义)也是私有的** function _alarm(){ _isAlarmed = true; alert(_alarmMessage); } function disableAlarm(){ _isAlarmed = false; } //**所有定义在原型上方法都是“公有”的,当我们在此处创建的类在闭包结束处被返回后,就可以在当前作用域之外** //访问这些方法了 Accommodation.prototype.lock = function(){ _isLocked = true; _alarm(); }; Accommodation.prototype.unlock = function(){ _isLocked = false; _disableAlarm(); }; //定义一个getter函数来对来对私有变量的值作只读访问——相当于受保护的 Accommodation.prototype.getIsLocked = function(){ return _isLocked ; }; //setter函数进行只写访问 Accommodation.prototype.setAlarmMessage = function(message){ _alarmMessage = message; }; //返回在这个作用域中创建的类,使之在外层作用域中即后面代码的所有位置都可用 return Accommodation;}());//创建一个对象实例var house = new Accommodation();house.lock(); //弹出警告消息“Alarm activeted”house._alarm(); //错误!_alarm()未公开,无法直接访问alert(house._isLocked); //undefined(私有,在闭包外不能访问)house.getIsLocked(); //true(返回isLocked,但不允许对其直接访问,所以该变量是只读的)house.setAlarmMessage("The alarm is now activated!"); house.lock(); //弹出警告消息“The alarm is now activated!”
一般情况下,我们应该讲所有变量和函数都定义为私有,除非明确需要将某些变量和方法公开暴露给外部。即使需要公开暴露,也应先考虑使用getter和setter方法来访问变量,这么做的好处是可以限制他人所能实施的操作,使其只能通过“类”提供的功能完成其需求,这样有助于减少“类”的使用者代码出错的机会。
0 0
- JavaScript公有、私有以及受保护的属性和方法
- 公有,私有,和受保护的继承
- 公有、私有和受保护
- 公有,保护,私有 派生的成员属性
- JavaScript 中 私有/公有属性 私有/公有方法 类/实例方法 的区别
- JavaScript中的私有函数;Javascript构造函数的私有方法中访问其属性和公有方法
- 公有、私有和受保护的继承--《C++ primer》笔记
- 【C++基础】公有,私有和受保护的继承
- 公有、私有和受保护成员的特点
- OC的私有、保护、公有和KVC
- 公有、私有和受保护继承
- 公有派生的公有成员、保护成员和私有成员
- js面向对象的公有、私有属性和方法
- JavaScript 对象方法 类方法 原型方法的区别;私有属性 公有属性 公有静态属性的区别
- js--属性和方法(私有/公有)
- 函数的公有属性和私有属性
- javascript 原型方法,对象方法,类方法;私有属性,公有属性,公有静态属性
- 公有继承,私有继承和保护继承的可见性
- Java 动态代理介绍及用法
- c语言-常量变量笔记
- arcgis 卸载和注册表相关总结
- 修改maven本地仓库位置
- 正则表达式的基础和语法
- JavaScript公有、私有以及受保护的属性和方法
- Leetcode no. 43
- 视图的优点与缺点总结
- Java学习笔记之深入理解关键字null
- 余额宝
- String.split("|")问题
- canvas的常见用法
- 专题三 · 1022
- 当vector中存储的类型为指针时,vector.clear()的执行结果