首页 > 语言 > JavaScript > 正文

javascript面向对象三大特征之封装实例详解

2024-05-06 15:36:43
字体:
来源:转载
供稿:网友

本文实例讲述了javascript面向对象三大特征之封装。分享给大家供大家参考,具体如下:

封装

封装(Encapsulation):就是把对象内部数据和操作细节进行隐藏。很多面向对象语言都支持封装特性,提供关键字如private来隐藏某些属性和方法。要想访问被封装对象中的数据,只能使用对象专门提供的对外接口,这个接口一般为方法。调用该方法能够获取对象内部数据。

在JavaScript语言中没有提供专门的信息封装关键字,不过可以使用闭包来创建,只允许从对象内部访问的方法和属性。另外,接口也是数据封装的一种工具,接口提供了外界访问方法的约定。在应用开发中,所有类都应定义接口,类只向外提供已实现接口中规定的方法,任何别的方法都是隐藏的。其所有属性都是私有的,外界只能通过接口中定义的存取操作与之打交道。

---引自 《jQuery开发从入门到精通》,不过原书有错误,或者可能是我错买了盗版,不过下面代码都是经过我修改的,没有问题。

被动封装

被动封装:就是对对象内部数据进行适当约定,这种约定具有很强的主观性,没有强制性保证,主要针对公共对象而言。一般来说,JavaScript所包含的数据都是公开的,没有隐私可言,其中的信息可以随意被访问。下面给出一个例子来阐述:

var Person = function (name,gender) { if(name === undefined) { throw new Error("name is necessary") } else { this.name = name; } if(gender === undefined) { throw new Error("gender is necessary") } else { this.gender = gender; }}var p = new Person("Tom",1); // 如果我们实例化的时候,如果传递参数错误了,将会报异常

为了数据安全,代码中适当的增加了一些条件限制,避免非法信息侵入。

var Animal = function (species) { if(!this.checkSpecies(species)) { throw new Error('species is illegal'); } else { this.species = species; }}Animal.prototype = { checkSpecies:function(species){ // 检测 species , 参数为 species , 合法返回true ,这里可自定义检测逻辑 // 这里先让它直接返回 true return true; }}var ani = new Animal("dog");

从更安全和扩展的角度来说,凡是类都应该定义接口,这样能够保证数据存取更加安全,同时也方便团队的合作。内部私有方法检测和接口措施可在一定程度上保护对象内部数据,但是他们也存在一个致命漏洞(这些属性和方法可以被公开重置,面对公开覆盖属性和方法值,任何人都无法阻止这种行为。),比如这样的:

var Util = function() {};Util.prototype = { _say:function(){ console.log("这里有一个私有的成员 _say方法"); }}// 下面我们来修改它Util.prototype._say = function(){ console.log('哈哈,我已经被修改了');}// 开始检测var util = new Util;util._say(); // 哈哈,我已经被修改了            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选