【发布时间】:2016-10-05 10:14:21
【问题描述】:
我正在使用代理来代理对象。 getter 和 setter 像预期的那样工作得很好。但是,apply 方法永远不会被调用。
var p = new Proxy({}, {
/* getter */
get(target, name) {
return target[name]
},
/* setter */
set(target, name, value) {
target[name] = value
},
/* supposedly called apply */
apply(target,that,arg) {
console.log('apply is called, what to do here?')
}
})
这样,我可以将某些内容分配给p 或返回某些内容,即使它不存在。
例如,当我让 getter 函数返回这个时
get(target, name) {
return 'getting ' + name
},
然后console.log(p.flappy) 我会得到响应“getting flappy”,即使它不存在。
到目前为止一切顺利,但是当我尝试调用 flappy 时执行 p.flapppy() 它会抛出一个错误,即 flappy 不是函数。
这仍然有些明显,因为 getter 不返回函数。当我让 getter 返回这样的函数时
get(target, name) {
return function() { return 'this is '+name }
},
我可以调用该属性而不必存在它。
console.log(
p.flappy() // this is flappy!
)
那么 apply 什么时候被调用呢?不在我刚刚在这里展示的 sn-p 中,在这种情况下也没有:
p.foo = function() {
console.log('yay!')
return 'foo!'
}
p.foo() 或 p.foo.call() 或 p.foo.apply() 不起作用,在这两种情况下都不会调用 apply。
这个旅程的最终目的是我想根据一个属性是被读取还是被调用返回一个不同值。像这样:
p.someNewProperty // return what the getter function returns
p.anotherProperty() // return something else here because this is a function call
这可能吗?
【问题讨论】:
标签: javascript node.js proxy call apply