2011-10-23 10 views
1

私は、スクリプトにnode.js module.exportsexportsルールを実装しようとしています。これらの2つの変数は、常に同じでなければなりません。人が変わっても、変わるべきです。2つのJavascript変数を常に等しくするにはどうすればいいですか?

私はセッターでこれをやってみましたが、o.fooとo.bar両方が未定義で終わる=/

var foo = { hello: 'world' }; 
var o = { 
    foo: foo, 
    bar: foo 
}; 


var inuse = false; 
var setter = function(val) { 
    if (inuse) return; 
    inuse = true; 
    o.foo = val; 
    o.bar = val; 
    inuse = false; 
}; 
o.__defineSetter__('foo', setter); 
o.__defineSetter__('bar', setter); 

o.foo = { hey: 'there' }; 

console.log(o.foo); 
console.log(o.bar); 
+3

私はそれを取得しません。両方が「常に同じ」でなければならない場合、なぜ2つの固有の変数が必要なのでしょうか?ちょうど1つ使ってください。 – Sparky

+0

私は同じことが不思議でした。しかし、私はvmでモジュールをロードすることをエミュレートしようとしているので、node.jsモジュールが現在動作しているので、これを行う必要があります。 – fent

答えて

2

は、同様にゲッターを作成し、異なるプロパティ名に割り当てます。

DEMO:http://jsfiddle.net/jqExh/

var foo = { hello: 'world' }; 
var o = { 
    _foo: foo, 
    _bar: foo 
}; 

var inuse = false; 

var setter = function(val) { 
    if (inuse) return; 
    inuse = true; 
    this._foo = val; 
    this._bar = val; 
    inuse = false; 
}; 
o.__defineGetter__('foo',function(){return this._foo;}); 
o.__defineGetter__('bar',function(){return this._bar;}); 
o.__defineSetter__('foo', setter); 
o.__defineSetter__('bar', setter); 

o.foo = { hey: 'there' }; 

console.log(o.foo); // Object 
console.log(o.bar); // Object 

console.log(o.foo === o.bar); // true 

console.log(o.foo.hey, o.bar.hey); // there there 

またはプロパティの代わりに変数を使用します。

DEMO:http://jsfiddle.net/jqExh/1/

var o = (function() { 
    var foo = { hello: 'world' }; 

    var _foo = foo; 
    var _bar = foo; 

    var _o = {}; 

    var inuse = false; 

    var setter = function(val) { 
     if (inuse) return; 
     inuse = true; 
     _foo = val; 
     _bar = val; 
     inuse = false; 
    }; 
    _o.__defineGetter__('foo',function(){return _foo;}); 
    _o.__defineGetter__('bar',function(){return _bar;}); 
    _o.__defineSetter__('foo', setter); 
    _o.__defineSetter__('bar', setter); 

    return _o; 
})(); 

o.foo = { hey: 'there' }; 

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

console.log(o.foo === o.bar); // true 

console.log(o.foo.hey, o.bar.hey); // there there 

ティそれを取得して設定する唯一の方法は、アクセサを使用することです。

+0

ありがとうございます。非常に素晴らしい。 – fent

+0

これはすべてのブラウザでは機能しないことに注意してください。非標準の '__defineGetter__'を廃止して使用するためには、 – jfriend00

+0

-1は代わりに' Object.defineProperty'を使います。 – Raynos

関連する問題