我正在尝试在脚本中实现node.js module.exports
和exports
规则。这两个变量应始终相等。即使一个人改变另一个人也应该改变。
我尝试用setter做这个,但o.foo和o.bar最终都是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);
答案 0 :(得分:2)
创建getter,并分配给不同的属性名称。
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
这样,获取和设置它们的唯一方法是通过访问器。