转载请注明出处: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,那是这位女士的隐私,你这样做是不道德的”。
本文介绍如何在JavaScript中通过局部变量和方法实现属性的隐藏与暴露,完成面向对象编程中的封装特性。

被折叠的 条评论
为什么被折叠?



