8
var tr={};
tr.SomeThing='SomeThingElse';
console.log(tr.SomeThing); // SomeThingElse
console.log(tr.Other); // undefined

tr.get=function(what){
    if (tr.hasOwnProperty(what)) return tr[what];
    else return what;
};
tr.get('SomeThing') // SomeThingElse
tr.get('Other') // Other

tr.Other または tr['Other'] およびオブジェクトの他のすべての未定義のプロパティを作成して、代わりに未定義の名前を返す方法はありますか?

4

3 に答える 3

5

3 つのソリューション:

  • オブジェクトを として実装しますProxy。これは、まさに必要なことを行うように設計されています。まだドラフトであり、現在は Firefox の Javascript 1.8.5 でのみサポートされています。ES6 で標準化されましたが、まだすべての環境で利用できるわけではありません。

  • 翻訳オブジェクトには、常に完全なメッセージ セットを入力してください。その「辞書」(サーバー側またはクライアント側)を作成するときは、常に必要なすべてのキーを含めてください。翻訳が存在しない場合は、代替言語、メッセージの名前、またはundefined選択した文字列表現を使用できます。

    ただし、存在しないプロパティは、「翻訳が利用できない」ではなく、常に「そのようなメッセージはありません」を意味する必要があります。

  • オブジェクト プロパティの代わりに、文字列パラメーターで getter 関数を使用します。その関数は、内部辞書オブジェクトでメッセージを検索し、プログラムでミスを処理できます。

    メッセージ名として「get」とcoを許可するために、辞書とは異なるマップオブジェクトをお勧めします。

var translate = (function(){
    var dict = {
        something: "somethingelse",
        ...
    };
    return {
        exists: function(name) { return name in dict; },
        get: function(name) { return this.exists(name) ? dict[name] : "undefined"; },
        set: function(name, msg) { dict[name] = msg; }
    };
})();
于 2012-07-17T13:34:56.227 に答える
2

オブジェクト初期化子を使用して、プロパティのゲッターを定義できます。

var o = {
  a: 7,
  get b() {
    return this.a + 1;
  },
  set c(x) {
    this.a = x / 2;
  }
};

console.log(o.a); // 7
console.log(o.b); // 8 <-- At this point the get b() method is initiated.
o.c = 50;         //   <-- At this point the set c(x) method is initiated
console.log(o.a); // 25

または使用Object.defineProperties()

var o = { a: 0 };

Object.defineProperties(o, {
    'b': { get: function() { return this.a + 1; } },
    'c': { set: function(x) { this.a = x / 2; } }
});

o.c = 10; // Runs the setter, which assigns 10 / 2 (5) to the 'a' property
console.log(o.b); // Runs the getter, which yields a + 1 or 6
于 2012-07-16T11:52:10.247 に答える
1

このソリューションはまさにあなたが探していたものではありませんが、Python の collections.defaultdict クラスの JavaScript 実装が役立つ場合があります。

var collections = require('pycollections');
var dd = new collections.DefaultDict([].constructor);
console.log(dd.get('missing'));  // []
dd.get(123).push('yay!');
console.log(dd.items()); // [['missing', []], [123, ['yay!']]]
于 2015-07-18T00:32:51.543 に答える