如题目是这样的,实现一个类让下面的代码可以正常运行:
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 "<用户未输入>"; } } }
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")
多谢回答,问题中的失误已修改。
两个回答的主要区别是什么呢,第一个回答比较容易看懂,您的看不太懂,怎么保证用new或不用new实例化都可以的。能否简单地讲解一下。非常感谢。
@菜鸟程序猿: 区别是楼上的是通过判断是否执行的new 操作,如果没执行new 操作就返回一个new的实例;
我那个是构造函数里面返回一个对象,根据js构造函数的特性,如果返回的是一个对象的话,this指向的对象会被丢弃,所以实际的构造函数是里面的A,这样就可以new 和 没有new都一样的行为了
这样写就可以了:
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 "<用户未输入>"; } } }