javascript类式继承新的尝试
2012-01-09 00:00
676 查看
我今天做的尝试是,如何更它更像其他的语言一样的使用继承机制,多层继承和更方面的调用父类的构造。
我希望达到的效果:
实例:
js继承
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 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是这样写的:
也许你会问,为什么不这样写:
这样看似没有问题,只有一级继承时会运行的很好,但是,如果多级继承时,就会造成死循环,因为:
这个方法会被一直覆盖重写掉,而造成死循环。
而我的做法是,用类的$supClass属性指向它所继承的父类构造,在prototype中也有个$supClass方法,这个$supClass第一次必须要在类的构造器中执行,prototype.$supClass在执行时,会通过arguments.callee.caller.$supClass来获得类的$supClass,然后通过apply在this执行。 这样$subClass就能根据不同的来,来获得类的父类构造器并执行。
我希望达到的效果:
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
实例:
js继承
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 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类式继承新的尝试
- 失败的尝试,使用继承扩展数组,以及ES6的必要性
- javascript类式继承模式#2——借用构造函数
- javascript类式继承模式#3——借用和设置原型
- javascript类式继承模式#4——共享原型
- javascript类式继承函数最优版
- Lua学习笔记(4)--继承的尝试(1)
- javascript类式继承1
- Lua学习笔记(5)--继承的尝试(2)
- javascript类式继承最优版
- Python 简单单继多继承尝试
- javascript类式继承
- javascript类式继承2
- java中的成员方法与成员变量的继承
- 程序员,为什么不尝试站着工作?
- 继承条款effecitve c++ 条款41-45
- Javascript玩转继承(一)
- Python基础14--继承
- 【Head First Java 读书笔记】(七)继承