Javascript代理:节点代理,和谐,混合对象与魔法getter和setter …在Coffeescript?

我想有一个代理对象的方法和私有variables附加​​到它。

也就是说,所有正常的对象属性:

foo = {} foo.bar = "baz" foo.boo = "hoo" 

与一些原型:

 foo.setPrivateThings = function(value){ if (value) private = value; return private; } 

枚举跳过私有variables/函数:

 console.log(foo); // { bar: "baz", boo: "hoo" } 

get / set将通过一个神奇的getter / setter来运行:

 foo.doesntexist = "..." = function(key){ console.log "Setting "+key; return new Date(); } 

到目前为止,我有这个使用节点代理hokey Coffeescript。 任何更好的答案?

 class Data constructor: (obj) -> @proxy = require "node-proxy" p = @proxy.create has: (name) -> name of obj hasOwn: (name) -> ({}).hasOwnProperty.call obj, name get: (receiver, name) -> p = obj.transform()[name] if typeof p != 'undefined' && p != '__lookupGetter__' && p != '__lookupSetter__' return p() # We could do magic getting here obj[name] set: (receiver, name, val) -> # We could do magic setting here obj[name] = val true enumerate: -> result = [] for name of obj result.push name if typeof obj[name] != 'function' result keys: -> Object.keys obj , obj _transform = {} p.transform = (_t) -> _transform = _t if _t return _transform return p d = new Data name: "Bill" colors: ["blue", "red"] d.transform timer: -> return new Date() console.log d.name, d.colors, d.timer console.log d 

产生

 Bill [ 'blue', 'red' ] Sat, 15 Oct 2011 06:39:27 GMT { name: 'Bill', colors: [ 'blue', 'red' ] } 

枚举跳过私有variables/函数:

 Object.defineProperty(foo, "name", { get: function () { "return magic"; }, set: function (value) { setMagic(value); }, writable: true, configurable: true enumerable: false }); 

代理是矫枉过正的,只是定义不可枚举的属性

感谢@Raynos,我认为这个解决scheme可能是合适的(将做更多的实验):

 obj = firstname: "Bill" lastname: "Fell" colors: ["blue", "red"] transform = name: -> "#{this.firstname} #{this.lastname}" colorstoo: "colors" for key, val of transform Object.defineProperty obj, key, get: if typeof val == "string" then new Function("return this.#{val}") else val enumerable: true console.log obj.name, obj.colorstoo console.log obj 

生产:

 Bill Fell [ 'blue', 'red' ] { firstname: 'Bill', lastname: 'Fell', colors: [ 'blue', 'red' ], name: [Getter], colorstoo: [Getter] } 

请注意,此解决scheme不允许dynamic获取/设置,只能定义为列表。