应用,一定要应用

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 阅读(1220) 评论(1)  编辑  收藏 所属分类: 其他应用

Feedback

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


只有注册用户登录后才能发表评论。


网站导航: