为什么结果是是undefined,其它两个变量都正常,请教

快信科技 2013-03-18 12:37:20

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());
...全文
317 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
快信科技 2013-03-19
  • 打赏
  • 举报
回复
谢谢你 我还要再看看
functionsub 2013-03-18
  • 打赏
  • 举报
回复
13行可以去掉,base属性没用了,不过你可以把parent改成base。
functionsub 2013-03-18
  • 打赏
  • 举报
回复
改了一下,这样就出来了,不知道跟你想要的是一样东西么。

    function Base() {}
         
    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);


functionsub 2013-03-18
  • 打赏
  • 举报
回复
= = 说实话我也想了半天,照你这种代码结构写的话,把obj['constructor']改成正确的父类,但是会造成function的无限执行(apply后this始终指向ChildClass,然后就一直调用整个方法体)。。。 肯定有办法可以解决,,回头有时间再想想。。 其实你可以去看看prototype的是怎么做的。
快信科技 2013-03-18
  • 打赏
  • 举报
回复
引用 1 楼 functionsub 的回复:
21行代码有问题。 obj['constructor'].apply(this, arguments); 这里的obj['constructor']是你顶级构造的那个构造函数,就是你代码里的Person 所以不会执行User的构造函数。 所以也就不会有password属性了
怎么解决 想了半天不知道怎么解决,谢谢你
functionsub 2013-03-18
  • 打赏
  • 举报
回复
21行代码有问题。 obj['constructor'].apply(this, arguments); 这里的obj['constructor']是你顶级构造的那个构造函数,就是你代码里的Person 所以不会执行User的构造函数。 所以也就不会有password属性了

87,915

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧