首页 新闻 赞助 找找看

javascript中如何让一个类既可以用new实例化,也可以不用new进行实例化?

0
悬赏园豆:10 [已解决问题] 解决于 2012-07-06 13:44

如题目是这样的,实现一个类让下面的代码可以正常运行:

        var me = Man({ fullname: "小李" });
        var she = new Man({ fullname: "小红" ,gender:"女"});
        
        console.group();
        console.info("我的名字是:" + me.attr("fullname") + "\n我的性别是:" + me.attr("gender"));
        console.info("她的名字是:" + she.attr("fullname") + "\n她的性别是:" + she.attr("gender"));
        console.groupEnd();
        /*------[执行结果]------

        我的名字是:小李
        我的性别是:<用户未输入>

        她的名字是:小红
        她的性别是:女
*/

我写了下面的代码,在new的情况下可以正常运行,但如何让这个类也支持不用new的情况?

Man=function(obj){
    for(var e in obj){
        this[e]=obj[e];
    }
}
Man.prototype.attr=function(attr,val){
    if(val){
        this[attr]=val;
    }
    else{
        if(this[attr]){
            return this[attr];
        }
        else{
            return "<用户未输入>";
        }
    }
}
草根程序猿的主页 草根程序猿 | 初学一级 | 园豆:129
提问于:2012-07-04 16:26
< >
分享
最佳答案
0
function Man(o) {
function A() {}
A.prototype.attr = function(str) {
return str in this ? this[str] : "<用户未输入>";
}
var obj = new A;
for (var e in o) {
obj[e] = o[e];
}
return obj;
}

另外上面的例子错了, 她的性别是:" + me.attr("gender") 这段应该是 she.attr("gender")

收获园豆:5
Hodor | 菜鸟二级 |园豆:207 | 2012-07-04 21:08

多谢回答,问题中的失误已修改。

两个回答的主要区别是什么呢,第一个回答比较容易看懂,您的看不太懂,怎么保证用new或不用new实例化都可以的。能否简单地讲解一下。非常感谢。

草根程序猿 | 园豆:129 (初学一级) | 2012-07-05 08:26

@菜鸟程序猿:  区别是楼上的是通过判断是否执行的new 操作,如果没执行new 操作就返回一个new的实例;

我那个是构造函数里面返回一个对象,根据js构造函数的特性,如果返回的是一个对象的话,this指向的对象会被丢弃,所以实际的构造函数是里面的A,这样就可以new 和 没有new都一样的行为了

Hodor | 园豆:207 (菜鸟二级) | 2012-07-05 10:45
其他回答(1)
0

这样写就可以了:

Man=function(obj){
    if(this instanceof arguments.callee){
        for(var e in obj){
            this[e]=obj[e];
        }
    }
    else{
        return new Man(obj);
    }
}
Man.prototype.attr=function(attr,val){
    if(val){
        this[attr]=val;
    }
    else{
        if(this[attr]){
            return this[attr];
        }
        else{
            return "<用户未输入>";
        }
    }
}
收获园豆:5
artwl | 园豆:16736 (专家六级) | 2012-07-04 16:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册