有没有办法改变两种分配方法的优先级

Is there any method to change the priority of the two assignment methods?

本文关键字:方法 优先级 分配 两种 改变 有没有      更新时间:2023-09-26

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

谁能帮助我?谢谢

你可以制作第二个字典:

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

使用属性保存属性。

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