2012-07-05 48 views
1

这是一个面试问题,要求写一个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 
------------------*/ 

谁能帮帮我?感谢

回答

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"。实际上,这种可能性是无限的。

2

使用属性保存属性。

var Man=function(){ 
    this.attributes = {}; 
}; 

Man.prototype.attr=function(attr,val){ 
    if(val){ 
     this.attributes[attr] = val; 
    } 
    else{ 
     return this.attributes[attr]; 
    } 
} 
相关问题