WEB开发网
开发学院网页设计JavaScript javascript面向对象之我解 阅读

javascript面向对象之我解

 2010-09-14 13:32:52 来源:WEB开发网   
核心提示: 如上示例,任何类(class1)的函数有两种实现方式,javascript面向对象之我解(2),一种的内联的方式,即在定义function的时候,同时两种脚本中的所有类型都不是封闭的,而是开放的,将方法写在body中;另一种是使用prototype,可以在任何地方定义

如上示例,任何类(class1)的函数有两种实现方式,一种的内联的方式,即在定义function的时候,将方法写在body中;另一种是使用prototype,可以在任何地方定义。对于类的实例(class1的实例c1),同时拥有这两种方式定义的方法。因为内联定义的优先级高,在实例调用方法时,首先查找内联定义,然后转到prototype的定义中查找。因此,prototype定义的方法会被内联定义覆盖掉。如果真的发生了方法覆盖,要想使用prototype定义的方法,至少有两种方法(以下假设class1中使用同时使用了上述两种形式定义了方法m1)。

第一种是使用delete,首先delete掉m1方法,根据优先级,自然delete掉的是内联的m1方法。什么,不明白为什么还能delete掉方法?首先。js是动态语言;其次,记住方法也只是一个function实例,在class1中只是一个特殊属性而已。

var c1 = new class1();
delete c1.m1; //去掉内联的m1方法
c1.m1(); //调用prototype的m1方法

第二种是使用apply方法。至于apply的使用方法,可以查看js手册。

var c1 = new class1();
class1.prototype.m.apply(c1); //使用prototype中定义的m方法代替c1的m方法

用new实例化的对象仍然同时是Function对象和Object对象,包括这两者的所有实例属性和方法。这里不是很好理解,想想看,我们定义的类同时是Function对象和Object对象的实例,然后实例化后,实例也同时是Function对象和Object对象的实例,有没有一点像父亲和儿子的爸爸是同一个人?呵呵,有点恶心了,还希望高手出来详细剖析一下Function对象和Object对象以及js里面的类型关系。

这里把js和ruby做个比较。js和ruby都有一个默认的全局对象,js中是Global对象,所用定义的全局变量和函数都是Global的成员。从这一点看,js也有一点oo的感觉(至少是形式上):-)。ruby中,同时存在class变量和实例变量,js也是。这种设计是脚本语言的优势,可以在运行时随时改变class的定义,非常灵活和强大。同时两种脚本中的所有类型都不是封闭的,而是开放的,用户可以给语言内置的所有类型添加额外的属性和方法。

上一页  1 2 3 4 5 6 7  下一页

Tags:javascript 面向 对象

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接