为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕运维8079593 2018-12-07 10:14:52
如题目是这样的,实现一个类让下面的代码可以正常运行: 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 "<用户未输入>"; } } }
查看完整描述

2 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

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

查看完整回答
反对 回复 2018-12-24
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

这样写就可以了:

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 "<用户未输入>";
        }
    }
}
查看完整回答
反对 回复 2018-12-24
  • 2 回答
  • 0 关注
  • 1247 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信