您的位置:首页 > Web前端 > JavaScript

javascript面向对象编程(五)

2014-01-14 13:22 246 查看
js面向对象编程中有一种叫做“甘露模型”的东西,而我也是初次从李战大哥的《悟透javascript》中首次听说,接触了之后一下子觉得其实js的面向对象编程其实也没有那么神奇,仅一个函数就可以完全涵盖。而且从经历中慢慢的体会发现,js的面向对象编程其实最主要解决的问题就是怎么共享方法,也就是如何更优雅的实现继承。因为我也接触有限,对于“甘露模型”个人觉得它描述出了js继承的本质,就像书中讲的拂去所有的浮华,还对象一个清净。

对于上篇文章最后我们使用的一种JSON方式的对象,其实它本身就是一个类了,可以直接使用了,如下:

<script type="text/javascript">
var Person = {
name : 'koma',
say : function() {
alert( this.name );
}
};
Person.say();
</script>


此时Person就是类名,而name,say这些就是类中的成员属性和方法,那JSON类的书写格式就是键值对的形式,键和值之间用冒号“:”分割,每一个属性或者方法之间用逗号“,”分割。

Person.say(); 就是类的调用方式,还有另外一种方便动态调用的形式是可以用数组的方式调用,例如:Person['say']();

从php的角度出发看这个类的时候,我们可以把Person类中所有的属性或者方法看做是静态的,因为它们只能通过类名(Person)来调用,这也是这种方式描述类的一个特点就是不需要使用new来实例化一个类,而直接可以使用。

但是这种方式不能通过new来实例化,那这样就导致类只能有一个实例那就是它自己,当需要多个实例的时候就得写多份,这显然是不行的,所以就用到了我们开始讲的“甘露模型”,如下代码:

<script type="text/javascript">
function New(aBase, args) {
function new_() {
if ( aBase.__construct ) {
aBase.__construct.call(this, args);	//初始化属性
}
}
new_.prototype = aBase;		//继承方法
return new new_();
}
var Person = {
name : null,
__construct : function(args) {
this.name = args[0];
},
say : function() {
alert( this.name );
}
};

var p1 = New(Person, ['koma']);
alert( p1.name );	//koma
var p2 = New(Person, ['koma0']);
alert( p2.name );	//koma0

alert( p1.say == p2.say );	//true
</script>


如上面的代码我们使用了一个简单的“甘露”就使得Person类可以实例化,这样就可以产生出不同的对象而不需要为不同的对象写多份代码,省去了很多麻烦,而且还可以通过__construct方法来作为类的构造函数,这里我起这个名字完全是跟php中类的构造方法同步,这样看起来就显得没那么吃力了,同时构造函数也不是必须的,这样就更显得灵活。

那有了这个“甘露”是不是就够了呢?

答案是不够的,因为这个甘露只能帮我们实现类的实例化而不能帮助我们解决继承的问题,但是这个“甘露模型”已经发挥出了它的威力,同时也诠释出了js中new操作符的本质过程。但是它还有缺陷,就是它不能够实现继承,而继承也是我们主要需要掌握的,但是这个“甘露”还不能实现继承,当然也不能够诠释出Js中继承的本质,但是它还是具有很大的学习和理解意义的。

那如何用这种“甘露”是来实现继承呢?等下篇文章再继续说吧。。。。上班了╮(╯▽╰)╭
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: