javascript面向对象之我解
2010-09-14 13:32:52 来源:WEB开发网另外闲扯一下有趣的话题:js的反射。js中任何对象(function和object)都可以使用如下方式遍历所有成员:
var info = typeof(obj)+'n';
for(p in obj) {
info += p + 'n';
}
alert(info);
同样使用反射,可以这样调用方法和属性:
alert(c1['a']);
c1['m1']();
可以这样考虑,在js的类中,本质上不区分方法和属性,因为方法也就是一个特殊的function对象而已。所以,js类中只存在一种东西:属性。可以猜测js类就是一个hash实现,将所有的属性按照名称和值存入。即可以按照一个类对待,也可以简单的作为一个hash对待。当我使用c1[m1]()形式的调用时,实际过程就是取出值,也就是一个function对象,然后执行之。
然后是继承,比较多的人推荐使用prototype实现继承,因为其强大和灵活。这里不详细介绍prototype,仅探讨我的一些思考,需要了解的读者可以参考文后的相关文章。在读者继续阅读之前,需要有以下几个认识:
1、prototype是对象,而不是简单值(数值、字符串等),因此是引用类型。简单的将prototype赋值给另一个变量,实际上只是浅拷贝了一个引用,拥有的是一个对象。既然对prototype的简单赋值是前拷贝,保存的是引用,自然对任何一个引用的修改都会影响所有的引用。
2、对于上文介绍的两种方法定义方式所定义的方法在类的实例中有着不同的处理方式。经过我设计的几个实验和阅读相关文章,认为一个类的实例实际上也是一个prototype,这个prototype包含两部分。一部分是内联定义的方法,prototype中直接保存了这种方法的深拷贝。另一部分是类所定义的prototype,在实例这个prototype中是以一个引用保存。这点很重要,是后面理解prototype继承中的种种陷阱的关键之一;
Tags:javascript 面向 对象
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接