应用,一定要应用

语源科技BlogJava 首页 新随笔 联系 聚合 管理
  25 Posts :: 0 Stories :: 118 Comments :: 0 Trackbacks

1.1. 继承

今天遇到了需要在 javascript 中继承的问题:

查了一些帖子,自己又写了几个例子测试了一下,总结如下:

1.1.1.     三种方法

js 中实现继承有三种方法:

假设父类为 Parent, 子类为 Child,

 

第一种,子类强制调用父类构造

function Child(){

       Parent.call(this);

}

 

第二种,子类间接调用父类构造

function Child(){

       this.base = Parent;

       this.base();

}

 

第三种:设置原型

function Child(){}

Child.prototype = new Parent();

这种方式虽然不够直观,却应该是最有效率的方式。

 

1.1.2.     总结:

其实 js 本身是没有什么继承之类的概念的,只是为了使用利用 js 的一些特性而加的。

 

js 的原型方式 prototype, 使得许多的工作变得容易。

 

一个 function 对象和根据 function 构造出来的对象是不同的。

 

一个 function 对象的原型其实就是一个根据 function 对象构建出来的对象。

记住:这个对象可与 new 出来的对象不一样。在 function 内部的代码并不会被执行,如:

this.funcName = function() 这样的代码。而 new 出来的对象则不然,他具有执行后的对象特性。

 

function 的局部变量相当于 class 里的私有变量,无法在子类中获取和操作。但 this. 的部分是可以的。

 

1.1.3.     猜测和假想

(这是我推断的,没有任何的根据,当然也是可以测试的):

当一个 Child 被 new 时,第一二种方法中, js 执行器

1 、先分配一个空间,(相当于 this = new Object() ) (msdn 中有具体的描述 )

2 、拷贝原型:

3 、执行构造:也就是 Child.call(this) (相当于 child(), 此时 this 对象有值)( msdn 中有描述)

然后执行 Parent(); 这个时候 parent 的构造函数执行以下几步:

1 、将 parent 的 prototype 拷贝到 object 区域,这时覆盖了前面的区域 ( 好像测试证明 parent 的原型并不会被拷贝,此步不会被执行 )

2 、对这个区域执行初始化,也就是正常的 function 调用的过程。(相当于 Parent(),this 变量有值)

 

而普通的 function 调用应该是这个样子:由于没有 new 操作符,所以没有为其分配当前的 this( 也没有空间 ),

this 被放到了 window 对象上。但是 new 的时候显然不是这样。

 

obj.func() 的调用和 func() 调用是完全不一样的, obj.func 中 this 对象是 obj 对象,而 func() 调用 this 对象是 window 对象,这个应该和 jvm 中静态方法和类实例方法调用的区别的原理一样。

 

1.2. 方法重载

在实现了对象继承之后,我开始面临到第二个问题,重载。

1.1.4.     两种方法

js 怎样实现重载。

1 、简单的重载:

在这种重载中,子类的方法无需调用父类的方法,直接在执行父类构造之后,再执行子类的重载方法,如 Parent 的 toString() 方法,这时只需执行 this.toString = function(){....} 就可以了。

 

2 、调用父类方法的重载:

由于 js 实际运行时并没有父类、子类两个实例空间,所以 super.toString() 肯定是不行的,而在子类的 toString 方法中进行 this.toString() 调用只能引起内存溢出,其实这种也可以想办法做到。

 

this.super_toString = this.toString();

this.toString=function(){

       ..............

       this.super_toString();

       ..............

}

posted on 2006-12-28 14:39 flyffa 阅读(1295) 评论(1)  编辑  收藏 所属分类: 其他应用

Feedback

# re: 【web】面向对象的javascript 2006-12-30 13:08 errorfun
看看prototype的 Object.extend的实现吧。  回复  更多评论