6

おそらく正しい言葉ではありません。しかし、JavaScript で新しい型を作成したいと考えています。これを行うことができるという単純なプロパティがあります。

var inst = new SomeType();
inst.key1.key2 = 'something';
inst.key1.key1.key3 = 'something';

基本的に、さらに拡張するためにオブジェクト リテラルを宣言する必要はありません。自動的に作成されます。

これにより、拡張するプロパティの存在をチェックすることを心配することなく、複雑な構造を構築できます。

する代わりに

inst.key1 = {};

inst.key1.key2 = 'data';

1つだけできる

inst.key1.key2 = 'data';

そしてその

inst.key1 = {};

つまり、内部的に発生します。

これには実用的な目的があります。特に、この新しいタイプを使用して、より階層的なアプローチを使用してデータを整理するレジストリ パターンがあります。

また、オブジェクト リテラルの存在をテストし、存在しない場合はオブジェクト リテラルを作成する、ライブラリで一般的なパターンも見られます。

これは一般的なイディオムのようです。

4

2 に答える 2

7

取得したいものは、Harmony プロキシ( MDN ) で簡単に実現できます。ただし、この API はまだ安定していないため、重要ではない趣味のコードで使用しても問題ありませんが、製品コードでは (まだ) 使用しないでください。

非常に単純な例を次に示します。

function getFreeChain(object) {
    var handler = {
        get: function(target, name) {
            if (name in target)
                return target[name];
            var newTarget = target[name] = {};
            return new Proxy(newTarget, handler);
        }
    };
    return new Proxy(object, handler);
}

// Usage:
var obj = {};
var magicalObj = getFreeChain(obj);
magicalObj.a.b.c.d.e.g = 1;
console.log(magicalObj.a.b.c.d.e.g); // 1
console.log(obj.a.b.c.d.e.g);        // 1
obj.x.y.z = 1;                       // TypeError: obj.x is undefined

注: 私の例は、ProxyFirefox でのみサポートされている最新の仕様の実装です。Chrome は、大幅に異なる古いバージョンの APIのみをサポートします。この APIは、で「実験的な JavaScript」をオンにすることで有効にできますchrome://flags/。この古い API は見栄えが悪く、以前の API を実装するにはかなり多くのコード行が必要になるため、これは読者の課題として残しておきます。

ああ、単純なプロキシ API を Chrome にもたらす( Harmony-reflectDirectProxies.jsに取って代わられた) という名前のライブラリがあります。このライブラリを含めた後、前のコードは Firefox と Chrome で動作します (実験が有効になっている場合): http://jsfiddle.net/PAhYL/

于 2013-06-19T17:47:02.590 に答える
0

JavaScript は演算子のオーバーロードをサポートしていないため、._そのように呼ばれる非常に醜い偽の演算子を作成することができます。誰かが実装したい場合は、._回答を編集してください。

http://jsfiddle.net/586Sc/

var Obj = function () {
    this.hold = {};
};

Obj.prototype._ = function (key) {
    //implement here;
    return this;
};

var obj = new Obj();

obj._('key1')._('key2')._('key3') = 'barbarella';
console.log(test);
于 2013-06-19T21:00:40.637 に答える