void a(){}
封装到类B:
class B{
void a(){}
}
这样就好了,
使用:
B haha=new B();
hahaa();//调用类B的实例haha中的a方法类的封装性即不能让外面的类随意修改一个类的成员变量;
在定义一个类的成员,使用private关键字说明这个成员的访问权限,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用;
为实现封装性,常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问。对一个变量的 *** 作,一般都有 读取和赋值 *** 作,我们一般定义两个方法来实现这两种 *** 作,即:getxxx()与setxxx();
一个类就是一个模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其他的一切内容。再进行程序设计时,应尽量避免一个模块直接修改或 *** 作另一个模块的数据,模块设计追求强内聚,弱
1 定义js类
js并不是一种面向对向的语言, 没有提供对类的支持, 因此我们不能像在传统的语言里那样 用class来定义类, 但我们可以利用js的闭包封装机制来实现js类, 我们来封装一个简的Shape类
代码如下:
function ShapeBase() {thisshow = function(){
alert("ShapeBase show");
};
thisinit = function(){
alert("ShapeBase init");
};
}
这个类里定义了两个方法:show和init, 需要注意的是这里用到了this来声明, 而不是var, 因为用var是用来定义私有方法的
另外, 我们还可以用prototype属性来定义Shape的方法
代码如下:
ShapeBaseprototypeshow=function(){
alert("ShapeBase show");
}
ShapeBaseprototypeinit=function()
{
alert("ShapeBase init");
}
上面这种写法看起来不太直观,我们可以将所有的方法写在一起
代码如下:
ShapeBaseprototype={show:function(){
alert("ShapeBase show");
},
init:function() {
alert("ShapeBase init");
}
};
现在, 类是写好了, 让我们写个js来测试下, 看看结果是不是跟我们想象的一样呢
代码如下:
function test(src){var s=new ShapeBase();
sinit();
sshow();
}
看到了吧, 其调用方式和C#一模一样, 而结果也如我们所料
到目前为止, 我们学会了如何创建js的类了, 但还只是实例方法,要是实现跟C#中的静态方法要怎么做呢?
其实, 实现js的静态方法很简单, 看下面如何实现:
代码如下:
//静态方法ShapeBaseStaticDraw = function()
{
alert("method draw is static");
}
2 实现JS类抽象和继承
同样, js中也不支持类继承机制,但我们可以通过将父类prototype中的成员方法复制到子类的prototype中来实现
和类的继承一样,JavaScript也没有任何机制用于支持抽象类但利用JavaScript语言本身的性质可以实现自己的抽象类
首先来看看js中的虚方法, 在传统语言中虚方法是要先定义的, 而包含虚方法的类就是抽象类,不能被实例化,而在JavaScript中,虚方法就可以看作该类中没有定义的方法,但已经通过this指针使用了
和传统面向对象不同的是,这里虚方法不需经过声明,而直接使用了, 并且类也可以被实例化
先定义object的extend方法, 一个为静态方法,一个为实例方法, 这两个方法用于实现继承的prototype复制
代码如下:
Objectextend = function(destination, source) {for (property in source) {
destination[property] = source[property];
}
return destination;
}
Objectprototypeextend = function(object) {
return Objectextendapply(this, [this, object]);
}
接下来我们实现一个继承类Rect, 这里先用一种简单的方法来实现。
代码如下:
function Rect() { }Rectprototype = ShapeBaseprototype; //只这一句就行了
//扩充新的方法
Rectprototypeadd=function() {
alert("Rect add");
}
这种方法不能用于重写,如果改变了show方法, ShapeBase的show也会指向同一函数可能是由于prototype赋值只是简单的改变指向地址
如果上面也定义了:
alert("Rect show");
}
那么执行结果如下:
var s=new ShapeBase();
sshow(); //结果:Rect show
var r=new Rect();
rshow(); //结果:Rect show
radd();
}
我们再使用objectextend实现继承, 并实现一个oninit虚方法, 修改ShapeBase如下:
代码如下:
ShapeBaseprototype={show:function()
{
alert("ShapeBase show");
},
initialize:function () {
thisoninit();
}
};
实现Rect类继承
代码如下:
Rectprototype=(new ShapeBase)extend({//添加新的方法
add:function() {
alert("Rect add");
},
//使用这种方法可以重写show方法
show:function() {
alert("Rect show");
},
//实现虚方法
oninit:function() {
alert("Rect oninit");
}
})用private来表述变量或类,方法,来达到防止被一些不必要的访问和修改。例如
private class pri()
{
}
private int i;
等等。
继承:
class c
{}
class A extends c
{}
这样就是A类继承C类了
JAVA的这些面向对象语言的特性,靠在这里一言两语只能是初步了解,要深刻认识,需要自己多去写一下代码,那样才能理解面向对象语言的特性,感受到它的好处。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)