如何使 2 个 Javascript 变量始终彼此相等?

发布于 2024-12-11 07:28:00 字数 541 浏览 1 评论 0原文

我正在尝试在脚本中实现 node.js module.exportsexports 规则。这两个变量在任何时候都应该彼此相等。即使其中一个发生变化,另一个也应该发生变化。

我尝试使用 setter 执行此操作,但 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);

I'm trying to implement the node.js module.exports and exports rule in a script. These 2 variables should be equal to each other at all times. Even when one changes the other one should change too.

I tried doing this with setters, but both o.foo and o.bar end up undefined =/

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);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明媚殇 2024-12-18 07:28:00

还创建 getter,并分配给不同的属性名称。

演示: 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

或者使用变量而不是属性:

演示: 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

这是唯一的方法获取和设置它们的方法是通过访问器。

Create getters as well, and assign to different property names.

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

Or use variables instead of properties:

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

This way the only way to get and set them is via the accessors.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文