javascript类式继承新的尝试

 更新时间:2012年01月09日 16:35:53   作者:  
研究javascript是很有意思的事情,以前我说过,在javascript中的继承,在于维持prototype指向同一object就行了,确实这样
我今天做的尝试是,如何更它更像其他的语言一样的使用继承机制,多层继承和更方面的调用父类的构造。
我希望达到的效果:
复制代码 代码如下:

function A(){
alert('a');
}
function B(){
this.$supClass();
alert('b');
}
extend(B,A);
function C(){
this.$supClass();
alert('c');
}
extend(C,B);
var c = new C();
alert( c instanceof A ); //true
alert( c instanceof B ); //true
alert( c instanceof C ); //true

实例:

[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]

我的extend是这样写的:
复制代码 代码如下:
 
function extend(subClass,supClass){ 
var fun = function(){}, 
prototype = subClass.prototype; 
fun.prototype = supClass.prototype; 
subClass.prototype = new fun(); 
for(var i in prototype){ 
subClass.prototype[i] = prototype[i]; 

subClass.$supClass = supClass; 
subClass.prototype.$supClass = function(){ 
var supClass = arguments.callee.caller.$supClass; 
if(typeof supClass == 'function'){ 
supClass.apply(this,arguments); 
this.$supClass = supClass; 

}; 
subClass.prototype.constructor = subClass; 
return subClass; 
}

也许你会问,为什么不这样写:
复制代码 代码如下:

function extend(subClass,supClass){
var fun = function(){},
prototype = subClass.prototype;
fun.prototype = supClass.prototype;
subClass.prototype = new fun();
for(var i in prototype){
subClass.prototype[i] = prototype[i];
}
subClass.prototype.$supClass = function(){
supClass.apply(this,arguments);
};
subClass.prototype.constructor = subClass;
return subClass;
}

这样看似没有问题,只有一级继承时会运行的很好,但是,如果多级继承时,就会造成死循环,因为:
复制代码 代码如下:

subClass.prototype.$supClass = function(){
supClass.apply(this,arguments);
};

这个方法会被一直覆盖重写掉,而造成死循环。
而我的做法是,用类的$supClass属性指向它所继承的父类构造,在prototype中也有个$supClass方法,这个$supClass第一次必须要在类的构造器中执行,prototype.$supClass在执行时,会通过arguments.callee.caller.$supClass来获得类的$supClass,然后通过apply在this执行。 这样$subClass就能根据不同的来,来获得类的父类构造器并执行。

相关文章

  • JavaScript 继承使用分析

    JavaScript 继承使用分析

    继承,通俗地说,之前你写过一些类,这些类中有一些是而你现在要写的类的功能的子集或者基本相同,那么你不用完全重新写一个新的类,你可以把之前写的类拿过来使用.这样的一种代码重用过程就叫做继承
    2011-05-05
  • javascript 写类方式之八

    javascript 写类方式之八

    这里用的是Ext core3.0,Ext中用Ext.extend来定义一个类(当然它更多用来扩展一个类),Ext整个框架各种控件如Panel,MessageBox等都是用Ext.extend方法来扩展。这里仅仅用它来定义一个最简单的类。
    2009-07-07
  • JavaScript之信息的封装 js对象入门

    JavaScript之信息的封装 js对象入门

    下面对代码的封装是比较常用的,也比较好理解,只有先掌握了这些,才能更深入的了解面向对于以及json格式的定义方法。
    2010-04-04
  • javascript 混合的构造函数和原型方式,动态原型方式

    javascript 混合的构造函数和原型方式,动态原型方式

    JS编程中最常用两种对象类定义的方式。不管是利用下面2种方式的那一种,都可以达到相同的效果!
    2009-12-12
  • Javascript 面向对象(一)(共有方法,私有方法,特权方法)

    Javascript 面向对象(一)(共有方法,私有方法,特权方法)

    最近在网上盾一些JS面向对象的东西。把其他高手们总结的东西,加上自己的理解,总结一下
    2012-05-05
  • javascript 面向对象的JavaScript类

    javascript 面向对象的JavaScript类

    这一节来说下紧接着的一个概念——类。虽然JavaScript中没有class关键字,但作为开发人员我们一定要有这个思想。在C#中类可以分为实例类和静态类,JavaScript亦然。
    2010-05-05
  • JavaScript 对象链式操作测试代码

    JavaScript 对象链式操作测试代码

    自从使用了jQuery以后,对它的链式操作很是依赖,以至于常常觉得其他库不好用。。
    2010-04-04
  • 关于js类的定义

    关于js类的定义

    这两天帮同学做秒杀网,打算将前台和后台彻底分离,仅用ajax通信。这样就免不了大量的使用javascript,于是发现,js果然是难学难用。
    2011-06-06
  • javascript 面向对象 function类

    javascript 面向对象 function类

    javascript中的类是用函数function表示的
    2010-05-05
  • Javascript面向对象之四 继承

    Javascript面向对象之四 继承

    继承是面向对象中比不可少的特性,但javascript中并没有继承的概念机制,但我们可以自己来实现这种功能。
    2011-02-02

最新评论