2011-10-23 49 views
1

我想實現的Node.js module.exports和腳本exports規則。這兩個變量在任何時候都應該相等。即使一個人改變了,另一個人也應該改變。如何讓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

我不明白。如果他們都必須「始終保持一致」,那麼爲什麼你需要兩個獨特的變量?只用一個。 – Sparky

+0

我想知道同樣的事情。但我試圖模擬在虛擬機中加載模塊,所以我需要這樣做,因爲它是當前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

請注意,這不適用於所有瀏覽器。 – jfriend00

+0

-1代替使用不推薦的非標準'__defineGetter__'使用'Object.defineProperty'。 – Raynos

相關問題