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

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

        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 "<用户未输入>";
        }
    }
}
慕运维8079593
浏览 1251回答 2
2回答

阿晨1998

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")

沧海一幻觉

这样写就可以了: 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 "<用户未输入>"; } } }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript