代码之家  ›  专栏  ›  技术社区  ›  Morrisda

在对象中找不到键时,返回不同的值而不是未定义的值

  •  0
  • Morrisda  · 技术社区  · 12 年前

    如果可能的话,我希望使用prototype为对象设置一个属性,这样当我尝试获取未定义的值时,它将返回默认值,而不是 undefined ,如:

    obj = {
      lang : {en: 'hello', it:'ciao'}
    }
    

    示例1: obj.lang.es ( 未定义 )-我想 obj.lang.en 而不是 未定义 .

    示例2: obj.something.else -我想得到 false 而不是错误,因为它无法读取 未定义 .

    4 回复  |  直到 12 年前
        1
  •  2
  •   Jorgeblom    12 年前

    这可能不是个好主意。 最好使用根密钥或默认密钥:

    obj = {
        lang : {root: 'hello', en: 'hello', it:'ciao'}
    }
    

    所以你可以这样要求语言:

    var hi = obj.lang.es || obj.lang.root;
    

    您可以将其与getter方法结合使用:

    var getTranslation = function(lang) {
        return obj.lang[lang] || obj.lang.root;
    };
    var hi = getTranslation("es");
    
        2
  •  1
  •   Tibos    12 年前

    这不是一个很好的解决方案,但在这里,创建一个原型对象,对于任何语言,该对象都将结果延迟到默认语言。然后,您的特定对象继承自该原型对象,并覆盖其所需的任何值。

    var languages = ['en', 'it', 'es']; // fill with every language you will ever use
    var defaultLang = 'en';
    
    var protoLang = Object.create(null);
    function getDefaultLanguage(){
      return this[defaultLang];
    }
    languages.forEach(function(language){
      Object.defineProperty(protoLang, language, {
        get : getDefaultLanguage
      });
    });
    
    
    var obj = {
      lang : Object.create(protoLang, {
        en : { value : 'hello' },
        it : { value : 'ciao' }
      })
    };
    
    
    obj.lang.es // "hello"
    obj.lang.en // "hello"
    obj.lang.it // "ciao"
    

    问题是必须首先定义每个属性,这就是为什么需要语言数组。

        3
  •  0
  •   fraxture    12 年前

    我同意@DCoder。也许是这样的:

    function getLang(lang) {
        var result = this.obj[lang];
        if ( typeof result == 'undefined' ) {
            result = this.obj.en;
        }
        return result;
    }
    
        4
  •  0
  •   jvperrin    12 年前

    你不需要 ; 对象内部,中没有内容 obj.lang ,请这样尝试:

    obj = {
      lang: {en: 'hello', it: 'ciao'}
    };
    
    if (obj.lang.hasOwnProperty("en")) {
      console.log(obj.lang.en);
    } else {
      console.log(false);
    }