function Base() {}
Base.extend = function(obj) {
//顶级构造
var Class = obj['constructor'];
//解析传入的对象实现构造函数
for(var i in obj) {
if(i != "constructor") {
Class.prototype[i] = obj[i];
}
}
Class.extend = function(objChild) {
var ChildClass = objChild['constructor'];
//继承父类的prototype方法
ChildClass.prototype = this.prototype;
//提供base方法调用父类的构造
ChildClass.prototype.base = function() {
obj['constructor'].apply(this, arguments)
}
//解析传入的对象实现构造函数
for(var k in objChild) {
if(k != "constructor") {
ChildClass.prototype[k] = objChild[k];
}
}
//子类的子类也有继承的特性
ChildClass.extend = Class.extend;
return ChildClass;
}
return Class;
}
var Person = Base.extend({
constructor: function(name) {
this.name = name;
},
getName : function() {
return this.name;
}
});
var User = Person.extend({
constructor: function(name, password) {
this.base(name);
this.password = password;
},
getPassword : function() {
return this.password;
}
});
var ArchiveUser = User.extend({
constructor: function(name, password, isAdmin) {
this.base(name, password);
this.isAdmin = isAdmin;
},
getAdmin : function() {
return this.isAdmin;
}
});
var archiveUser = new ArchiveUser("Jack", "123", 1);
alert(archiveUser.getPassword());
constructorfunctionprototypejavascript
解决方案 »
- javascript验证 求解
- 这一段JS代码为什么不能在搜狗浏览器高速显示?document.write()
- 获取坐标
- javascript 怎么来控制iframe的滚动条?
- 这个开发不出来我就的衮蛋了。求帮助。关于给Div布局的。
- js取得超连接的值,急,在线等!
- 关于document.all.objList.ConnectDB("mlidbrollup", "rdrollup", "rdreport", "rd9905", false);的问题
- 关于在模式对话框ShowModalDialog()中的,数据提交,及iframe动态更新问题
- 关于window.parent的兼容性问题求教
- 在网上找了两段代码,如何整理在一起
- javascript导航栏问题
- 按钮替换按钮
说实话我也想了半天,照你这种代码结构写的话,把obj['constructor']改成正确的父类,但是会造成function的无限执行(apply后this始终指向ChildClass,然后就一直调用整个方法体)肯定有办法可以解决,,回头有时间再想想。。其实你可以去看看prototype的是怎么做的。
Base.extend = function(obj) {
//顶级构造
var Class = obj['constructor'];
//解析传入的对象实现构造函数
for(var i in obj) {
if(i != "constructor") {
Class.prototype[i] = obj[i];
}
}
Class.parent = Base;
Class.prototype.base = Class;
Class.extend = function(objChild) {
var ChildClass = objChild['constructor'];
ChildClass.parent = this;
//继承父类的prototype方法
ChildClass.prototype = this.prototype;
//解析传入的对象实现构造函数
for(var k in objChild) {
if(k != "constructor") {
ChildClass.prototype[k] = objChild[k];
}
}
//子类的子类也有继承的特性
ChildClass.extend = function(){
return Class.extend.apply(this,arguments);
}
return ChildClass;
}
return Class;
}
var Person = Base.extend({
constructor: function(name) {
this.name = name;
},
getName : function() {
return this.name;
}
});
var User = Person.extend({
constructor: function(name, password) {
User.parent.call(this,name);
this.password = password;
},
getPassword : function() {
return this.password;
}
});
var ArchiveUser = User.extend({
constructor: function(name, password, isAdmin) {
ArchiveUser.parent.call(this,name,password);
this.isAdmin = isAdmin;
},
getAdmin : function() {
return this.isAdmin;
}
});
console.log(Person.parent.toString())
console.log(User.parent.toString())
console.log(ArchiveUser.parent.toString())
var archiveUser = new ArchiveUser("Jack", "123", 1);
console.log(archiveUser);