Я хотел бы иметь прокси-объект с прикрепленными к нему методами и закрытыми переменными.
То есть все обычные свойства объекта:
foo = {}
foo.bar = "baz"
foo.boo = "hoo"
с некоторыми прототипами:
foo.setPrivateThings = function(value){ if (value) private = value; return private; }
, где перечисление пропускает частные переменные / функции:
console.log(foo); // { bar: "baz", boo: "hoo" }
, а get / set будет выполняться через магический метод получения / установки:
foo.doesntexist = "..." = function(key){ console.log "Setting "+key; return new Date(); }
ПокаУ меня есть этот хоккейный Coffeescript с использованием node-proxy.Любые лучшие ответы?
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' ] }