首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

5.7.2  私有属性和使用JavaScript的信息隐藏

铁杆的面向对象设计支持者会注意到,当使用prototype方法向JavaScript对象增加属性和函数时,所增加的属性和函数都是公用的,所有其他对象都能访问。对于函数来说,这通常没有问题,因为大多数函数都确实应当提供给外部客户。但是对于属性,面向对象设计的支持者就会指出,公有属性违反了信息隐藏的概念,对象的属性应当是私有的,因此外部客户不能直接访问。外部客户只能通过公用可用的函数来访问对象的私有属性。

对于JavaScript,同样有可能创建外部客户不能访问的私有属性,而只能通过对象的(公用)方法来访问,但这一点很少有人知道。Douglas Crockford[3]提出了一种在JavaScript中创建私有属性的方法。这种方法非常简单,总结如下:

l    私有属性可以在构造函数中使用var关键字定义。

l    私有属性只能由特权函数privileged function)公用访问。特权函数就是在构造函数中使用this关键字定义的函数。外部客户可以访问特权函数,而且特权函数可以访问对象的私有属性。

下面来考虑前一个示例中的Vehicle类。假设你想让wheelCountcurbWeightIn- Pounds属性是私有的,并只能通过公用方法访问。新的Vehicle对象如代码清单5-4所示。

代码清单5-4  重写后的Vehicle对象

function Vehicle() {

    var wheelCount = 4;

    var curbWeightInPounds = 4000;

 

    this.getWheelCount = function() {

        return wheelCount;

    }

 

    this.setWheelCount = function(count) {

        wheelCount = count;

    }

 

    this.getCurbWeightInPounds = function() {

        return curbWeightInPounds;

    }

 

    this.setCurbWeightInPounds = function(weight) {

        curbWeightInPounds = weight;

    }

 

    this.refuel = function() {

        return "Refueling Vehicle with regular 87 octane gasoline";

    }

 

    this.mainTasks = function() {

        return "Driving to work, school, and the grocery store";

    }

}

注意,wheelCountcurbWeightInPounds属性都在构造函数中使用var关键字定义,这就使得这两个属性是私有属性。属性不再是公用的,如果想通过点记法访问wheelCount属性的值,如下:

var numberOfWheels = vehicle.wheelCount;

就会返回undefined,而不是wheelCount实际的值。

由于属性现在是私有的,因此需要提供能访问这些属性的公用函数。getWheelCountsetWheelCountgetCurbWeightInPoundssetCurbWeightInPounds函数就是作此使用的。现在Vehicle对象可以保证只能通过公用函数访问私有属性,因此满足了信息隐藏的概念。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论