【发布时间】:2020-01-22 02:18:23
【问题描述】:
TL:DR;是否可以使对象的属性仅可调用(作为函数)?
这是什么意思
class Foo{
bar(value){
return value
}
}
let newFoo = new Foo()
console.log(newFoo.bar(123)) // should work fine as function is invoked
console.log(newFoo.bar) // here i need to throw or display an error instead of returning value
我尝试使用Proxy 和handler.get 陷阱来执行此操作,但我不知道如何捕获它是函数调用还是只是属性访问,
class Foo {
bar(value) {
return value
}
}
const proxied = new Proxy(new Foo(), {
get: function(target, prop, reciver) {
if (prop === 'bar') {
throw new Error('Bar is method need to be invoced')
}
return target[prop]
}
})
console.log(proxied.bar(true))
console.log(proxied.bar)
我也检查了handler.apply,但这似乎也没有用,因为这是功能上的陷阱,而不是属性上的陷阱
class Foo {
bar(value) {
return value
}
}
const proxied = new Proxy(new Foo(), {
apply: function(target, thisArg, argumentsList) {
return target(argumentsList[0])
},
get: function(target, prop, reciver) {
if (prop === 'bar') {
throw new Error('Bar is method need to be invoced')
}
return target[prop]
}
})
console.log(proxied.bar(true))
console.log(proxied.bar)
【问题讨论】:
-
我不认为所以,
newFoo.bar将在后续参数列表应用于前一个表达式之前被评估为表达式,所以如果访问newFoo.bar会抛出, 调用newFoo.bar也得扔 -
@CertainPerformance 是的,这就是我的想法,因为
.访问器将返回属性,然后将被调用,但不确定,因为在 JS 中总是有实现某件事的方法,所以希望有无论如何都要这样做 -
为什么需要这样做,听起来像XY problem
-
@JaromandaX 我正在尝试练习代理,并试图模仿严格的环境(或者您可以将其称为对象的 linter 类的东西)只是为了学习目的,这可能是
XY问题我不确定,我厌倦了我对代理的任何知识并且无法成功,所以我在这里问人们是否有任何其他方式可以完成,或者首先可以完成 -
@Code Maniac 因为据我所知你必须在
call之前get,你可以检查它是否在get之后被调用,所以像这样jsfiddle.net/y52khqs8
标签: javascript object ecmascript-6 es6-proxy