蓝色_冰点 2014年06月16日
javascript的类继承机制
自己写的,一直在用着,无不良反应,晒出来玩玩哈。。。
<html>
<head>
<title></title>
<script type="text/javascript">
(function(){
function callBase() {
var baseName = arguments[0];
var args = [];
for (var i = 1; i < arguments.length; i++) {
args.push(arguments[i]);
}
if (!this.__callStack) {
this.__callStack = {};
}
if (!this.__callStack[baseName]) {
this.__callStack[baseName] = [];
}
var fun = null;
var cs = this.__callStack[baseName];
if (cs.length == 0) {
fun = this[baseName].base;
}
else {
fun = cs[cs.length - 1].base;
}
cs.push(fun);

var rv = null;
try {
rv = fun.apply(this, args);
}
catch (err) {
cs.length = 0;
throw err;
}
cs.pop();
return rv;
}
var _id = 0;
function clsID() {
_id++;
return "c" + _id;
}
var clsMap = {};
Function._class = clsID();
Function.prototype.extend = function (baseCls, proto) {
var F = function () { };
F.prototype = baseCls.prototype;
this.prototype = new F();
for (var member in proto) {
var oldFun = this.prototype[member];
var newFun = proto[member];
if (oldFun) {
newFun.base = oldFun;
}
this.prototype[member] = newFun;
}
this.prototype.callBase = callBase;
var clsKey = baseCls._class + "/" + clsID();
this._class = clsKey;
this.prototype.constructor = this;
clsMap[clsKey] = this;
};
Function.prototype._class = "cls_native";
})();
</script>
</head>
<body>
<script type="text/javascript">
/**
父类定义
*/
function ClassA(){
this.name="My name is ClassA";
}
ClassA.prototype.show=function(){ alert(this.name) };

function ClassB(){
//调用父类构造函数
ClassA.call(this);
this.name=this.name+"(extend)";
}
//继承自ClassA
//子类.extend(父类,{ ... /* 子类扩展的方法..*/ });
ClassB.extend(ClassA,
{
//覆盖父类的show函数
show:function(){
this.callBase("show"); //可以调用父类的方法
alert("再alert一下:"+this.name);
}
}
)

var a=new ClassA();
a.show();

var b=new ClassB();
b.show();

</script>
</body>
</html>
...全文
58 点赞 收藏 2
写回复
2 条回复

还没有回复,快来抢沙发~

发动态
发帖子
JavaScript
创建于2007-09-28

5.1w+

社区成员

22.3w+

社区内容

Web 开发 JavaScript
社区公告
暂无公告