面向对象的Javascript:封装

来源:互联网 发布:手机网络掩码怎么设置 编辑:程序博客网 时间:2024/06/11 00:14

转载请注明出处:http://www.3body.tk/iblog/

Javascript是一门基于对象的语言,而不是面向对象。所以面向对象特有的一些概念在Javascript并不具备。但是我们可以通过Javascript语言提供的其他特点辅助实现面向对象编程。

本文讲述如何在Javascript中实现面向对象编程的特性之一–封装

首先来看一个基本的Javascript Class:

  var Lily = function() {    this.name = "lily";    this.age = 14;    this.speak = function(something) {      alert("lily:" + something);    };  };

上面定义了一个简单的Class,名字为Lily,类中包含了Lily同学的姓名,年龄,和她具有的一个行为–说话。我们再根据Lily这个Class创建出一个对象:

  var lily = new Lily();  document.write("lily's name is " + lily.name);  document.write("lily's age is " + lily.age);  lily.speak("hello world");

可以看出,由于Javascript本身不具备定义public,private,protected这些面向对象语言(比如Java)特有的隐藏/公开信息的声明特性,所有的属性,方法都是public的。那如何才能让Lily把自己不想公开的信息隐藏起来呢,比如这位MM的年龄?

想一下?在Javascript中如果将一个变量作为局部变量定义在方法内部,那么这个局部变量对于方法外的其他域来说是不可访问的。这个概念跟面向对象方法中的private声明看上去是不是有些类似。刚好在Javascript中我们定义一个Class也是用Function来实现,那么如下:

  var Lily = function() {    var age = 14;    this.name = "lily";    this.speak = function(something) {      alert("lily:" + something);    };  };

这样Lily的年龄就是个秘密了。可是万一过了一年,Lily同学的学校要将所有的同学年龄加上一岁,可是Lily的年龄由于谁都不知道(除了她自己),学校应该怎么办呢?这时候Lily 为了不暴露自己的年龄,便主动跟学校说,你什么时候要把年龄加一就告诉我一下,我自己加就行~~

  var Lily = function() {    var age = 14;    this.name = "lily";    this.speak = function(something) {      alert("lily:" + something);    };    this.ageUp = function() {      age ++;    };  };

一年一年过去了,马上就要毕业了,同学们对Lily的年龄十分好奇,想你看上去挺年轻的啊,怎么不敢将年龄告诉大家呢,难道是个装嫩的阿姨?Lily同学听说后不淡定了:

  var Lily = function() {    var age = 14;    this.name = "lily";    this.speak = function(something) {      alert("lily:" + something);    };    this.ageUp = function() {      age ++;    };    this.getAge = function() {      return age;    }  };

说你们谁爱看谁看呗。人家是怕太年轻吓到你们咯~~

当然,Lily同学也经常有些小动作,比如偷偷的唱个生日歌什么的,就不足为外人道了,

  var Lily = function() {    var age = 14;    this.name = "lily";    var sing = function(song) {      // sing a song    };    this.speak = function(something) {      alert("lily:" + something);    };    this.ageUp = function() {      sing("Happy birthday to me");      age ++;    };    this.getAge = function() {      return age;    }  };

好了,以上就是在Javascript中实现的简单的信息隐藏,但是这种封装方式对于继承机制来说并不友好,所以一般只用在不再继承体系中的一个独立的类中。如果实现一个完整的继承体系,我比较倾向于使用约定的编码规则来声明private,比如所有私有方法与属性前加下划线。

var Lily = function() {    this._age = 14;    this.name = "lily";    this.speak = function(something) {      alert("lily:" + something);    };    this.ageUp = function() {      this._age ++;    };    this.getAge = function() {      return this._age;    }  };

这样虽然大家都可以查到Lily同学的年龄,但是如果谁真的去查了,

var lily = new Lily();alert("哈哈,lily的年龄是:" + lily._age);

就会受到大家的指责:“Hi,那是这位女士的隐私,你这样做是不道德的”。