【发布时间】:2019-09-07 08:17:14
【问题描述】:
对于 Javascripters 来说真的很有趣的问题
在 Javascript 中,可以在使用 proxies 获取属性时进行拦截。
此外,通过如下所示的小技巧,可以在获取类的静态属性时进行拦截:
class Handler{
constructor(object){
this.object = object;
}
get(target, property){
if (property === 'all') {
return () => `selecting data from table: ${this.object.table}` ;
}
return target[property];
}
}
class User{
static table = 'users'
}
Object.setPrototypeOf(User, new Proxy({}, new Handler(User)));
console.log(User.all()); // prints "selecting data from table: users"
问题出现在我尝试扩展User类,然后尝试调用User父类下的静态方法时:
class Handler{
constructor(object){
this.object = object;
}
get(target, property){
if (property === 'all') {
return () => `selecting data from table: ${this.object.getTable()}` ;
}
return target[property];
}
}
class Model{
static getTable(){return this.table;}
}
class User extends Model{
static table = 'users'
}
Object.setPrototypeOf(User, new Proxy({}, new Handler(User)));
console.log(User.all());
运行它会得到TypeError: this.object.getTable is not a function。
调试代码,我发现this.object 不是User 类,而是某种function。
是否可以通过任何变通方法调用父级的静态方法getTable?
第二个问题,如果你设法解决了第一个问题,我无法再实例化 User 类:
console.log(new User());
TypeError: Super constructor [object Object] of User is not a constructor
我认为这是因为User 不再是一个类:console.log(User) 导致ƒ [object Function] 不是class User extends Model
语言是否允许这种功能?
【问题讨论】:
标签: javascript inheritance proxy static prototype