面向对象的Javascript:封装

本文介绍如何在JavaScript中通过局部变量和方法实现属性的隐藏与暴露,完成面向对象编程中的封装特性。

转载请注明出处: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,那是这位女士的隐私,你这样做是不道德的”。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值