10

基本的に私はこれを行うことができる必要があります:

var obj = {"foo":"bar"},
    arr = [];
with( obj ){
   arr.push( foo );
   arr.push( notDefinedOnObj ); // fails with 'ReferenceError: notDefinedOnObj is not defined'
}
console.log(arr); // ["bar", ""] <- this is what it should be.

{}.__defineGetter__ すべての未定義のプロパティ getter に対して空の文字列を返すために、または{get}に相当する「グローバル」を探しています (これは であるプロパティとは異なることに注意してくださいundefined)。

4

4 に答える 4

11

を作成して、Proxy未定義のプロパティにアクセスするたびに空の文字列を返すことができます。

app.js:

var obj = {"foo":"bar"},
    arr = [],
    p = Proxy.create({
        get: function(proxy, name) {
            return obj[name] === undefined ? '' : obj[name];
        }
    });
arr.push( p.foo );
arr.push( p.notDefinedOnObj );

console.log(arr);

質問の著者である David Murdoch が指摘しているように、ノード v0.6.18 (この投稿が書かれた時点での最新の安定版リリース) を使用している場合は--harmony_proxies、スクリプトを実行するときにオプションを渡す必要があります。

$ node --harmony_proxies app.js
[ 'bar', '' ]

次のようにを使用すると、このソリューションは機能しないwithことに注意してください。

var obj = {"foo":"bar"},
    arr = [],
    p = Proxy.create({
        get: function(proxy, name) {
            return obj[name] === undefined ? '' : obj[name];
        }
    });
with ( p ) {
   arr.push( foo ); // ReferenceError: foo is not defined
   arr.push( notDefinedOnObj );
}

console.log(arr);

withgetプロキシをスコープチェーンに追加するときに、プロキシのメソッドを呼び出していないようです。

Proxy.create()注:この例で渡されたプロキシ ハンドラは不完全です。詳細については、プロキシ: よくある間違いと誤解を参照してください。

于 2012-05-24T19:50:10.173 に答える
3

JavaScript には、グローバルな欠落メンバー ハンドラーはありません。動作を抽象化する関数を導入する必要があります

function getOrEmpty(obj, name) {
  if (!obj.hasOwnProperty(name)) {
    return "";
  }
  return obj[name];
}

var obj = {"foo":"bar"},
    arr = [];
arr.push(getOrEmpty(obj, "foo"));
arr.push(getOrEmpty(obj, "someUndefinedProperty"));
console.log(arr);
于 2012-05-23T21:15:27.277 に答える
1

ES6以降では、受け入れられた回答が示唆するように、プロキシを使用できます。しかし、ES5 に行き詰まっている場合の答えは次のとおりです。

ES5 では、この簡単な例のように、独自のクラスを作成する必要があります

function StrictObject() {
  var values = Object.create(null);
  this.set = function (key, value) {
    values[key] = value;
  };
  this.get = function (key) {
    if (!(key in values)) {
      throw new Error("Could not find " + key);
    }
    return values[key];
  };
}
var obj = new StrictObject();

obj.set('dad', 'homer');
console.log(obj.get('dad'));    // homer
console.log(obj.get('uncle'));  // throws error
于 2016-05-02T10:27:09.307 に答える
1

Proxy.createもはや問題ではないようです。

新しい例を次に示します。

const p = new Proxy({foo:1}, {
    get(obj, name) {
        return Object.hasOwnProperty.call(obj, name) ? obj[name] : '';
    }
})

console.log(p.foo);
console.log(p.bar);

これを [ab] 使用して、React ヘルパーの作成などの楽しい小さなことを行うことができます。

const cc = new Proxy(Object.create(null), {
    get(proxy, name) {
        return ({className,...props}) => React.createElement(name, {className: classcat(className), ...props})
    }
})

<cc.tr className={[theme.tr,theme.hrow]}>...</cc.tr>
// renders: <tr class="datatable_tr--2vnM1 datatable_hrow--_PG2G">...</tr>
于 2018-03-29T18:23:05.733 に答える