这是一个面试问题,要求编写一个Man
类让以下代码正常运行:
var me =new Man();
//method one:
me.attr("fullname", "tom");
//method two:
me.fullname = "jim";
console.info("my name is:" + me.attr("fullname"));
/*------[result is]------
my name is:tom
------------------*/
我的回答是:
var Man=function(){
};
Man.prototype.attr=function(attr,val){
if(val){
this[attr]=val;
}
else{
return this[attr];
}
}
我的代码运行结果是:
/*------[result is]------
my name is:jim
------------------*/
谁可以帮助我?感谢
答案 0 :(得分:4)
你可以制作第二本字典:
function Man() {
this.dictionary = {};
}
Man.prototype.attr = function(attr, val) {
if(arguments.length > 1) {
this.dictionary[attr] = val;
} else {
return this.dictionary[attr];
}
};
您可以使用已关闭的变量:
function Man() {
var dictionary = {};
this.attr = function(attr, val) {
if(arguments.length > 1) {
dictionary[attr] = val;
} else {
return dictionary[attr];
}
};
}
您可以使用已关闭的fullname
变量,并忽略除'fullname'
以外的所有内容:
function Man() {
var fullname;
this.attr = function(attr, val) {
if(attr === 'fullname') {
if(arguments.length > 1) {
fullname = val;
} else {
return fullname;
}
}
};
}
您也可以每次都返回"tom"
,或假装所有属性都是"fullname"
,或两者兼而有之。你可以ROT13 property names before assigning them。你可以add underscores。你可以create a property instead that throws away values beginning with "j"
。实际上,可能性是无限的。
答案 1 :(得分:2)
使用属性保存属性。
var Man=function(){
this.attributes = {};
};
Man.prototype.attr=function(attr,val){
if(val){
this.attributes[attr] = val;
}
else{
return this.attributes[attr];
}
}