Как сделать так, чтобы 2 переменные Javascript всегда были равны друг другу? - PullRequest
1 голос
/ 23 октября 2011

Я пытаюсь реализовать правило node.js module.exports и exports в скрипте.Эти 2 переменные должны быть всегда равны друг другу.Даже когда одно меняется, другое тоже должно меняться.

Я пытался сделать это с помощью сеттеров, но и 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);

1 Ответ

2 голосов
/ 23 октября 2011

Также создайте геттеры и присвойте разные имена свойств.

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

Таким образом, единственный способ получить и установить их через средства доступа.

...