2

foo.propertiesを返すような変数を作成したい{default:{x:undefined}}。ただし、プロパティ変数は直接編集できない__defineGetter__ため、読み取り可能にするために使用されますが、書き込み可能ではないことに気付くかもしれません。

問題は、プロパティ変数の一部ではなく、プロパティをゲッターの一部にしたいということです。しかし、ここfoo.propertiesでコンソールに入力すると、 が返されます{default:{x:undefined},attr:function(){ [native code] }}。attr がプロパティ変数に関連付けられないようにするにはどうすればよいですか?

var foo = new (function(){
    var properties = {
        default:{
            x:undefined
        }
    };
    this.__defineGetter__('properties',(function(){return properties;}).bind(this));
    this.properties.attr = (function(attr,value){
        var attr = attr.split('.');
        var recursive = function(attr,output,value){
            if(attr.length>1){
                return recursive(attr.slice(1),output[attr[0]],value);
            }else{
                if(value!=undefined){output[attr[0]] = value;};
                return output[attr[0]];
            };
        };
        return recursive(attr,properties,value || undefined);
    }).bind(this)
});

ありがとう!

編集

this.properties.attrが設定されている場合、ゲッターpropertiesは の代わりに変数を返すと思いますthis.properties。したがって、propertiesは直接編集されます。おそらく、ゲッターpropertiesからの戻り値を実際の変数とは別のエンティティにすることは可能ですか?

4

1 に答える 1

0

わかりましたので、これをまっすぐにさせてください。foo のスコープで変数を返すゲッターがあります。また、返された値のみにプロパティを追加し、.attrfoo のスコープ内の変数を変更したくないですか?

それが正しい場合は、これについて少し異なる方法で行う必要があります。変数と同じゲッターから値を返していることは正しいです。

したがって、これを回避するには、まず変数を複製し、割り当てて.attrから返す必要があります。

このコードはトリックを行います:

var foo = new (function(){
    var properties = {
        default:{
            x:undefined
        }
    };
    this.__defineGetter__('properties',(function(){
      var temp = clone(properties);
      temp.attr = (function(attr,value){
            var attr = attr.split('.');
            var recursive = function(attr,output,value){
                if(attr.length>1){
                    return recursive(attr.slice(1),output[attr[0]],value);
                }else{
                    if(value!=undefined){output[attr[0]] = value;};
                    return output[attr[0]];
                };
            };
            return recursive(attr,properties,value || undefined);
        }).bind(this)
      return temp;
    }).bind(this));

});

function clone(obj){
    if(obj == null || typeof(obj) != 'object')
        return obj;

    var temp = obj.constructor();

    for(var key in obj)
        temp[key] = clone(obj[key]);
    return temp;
}

これがデモjsFiddleです

それが役に立ったことを願っています!

于 2013-01-14T02:58:42.110 に答える