有没有方法可以改变两种赋值方法的优先级?

时间:2012-07-05 03:18:47

标签: javascript

这是一个面试问题,要求编写一个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
------------------*/
谁可以帮助我?感谢

2 个答案:

答案 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];
    }
}