2012-07-05 46 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]; 
    } 
} 
相關問題