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

2 回答 2

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 属性名称。您可以添加下划线。您可以创建一个属性,而不是丢弃以"j". 实际上,可能性是无限的。

于 2012-07-05T03:21:49.007 回答
2

使用属性来保存属性。

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

Man.prototype.attr=function(attr,val){
    if(val){
        this.attributes[attr] = val;
    }
    else{
        return this.attributes[attr];
    }
}
于 2012-07-05T03:24:09.307 回答