[英]How to make a getter proxy for all instances of a class in javascript?
代理可用于为对象定义“通用吸气剂”。 例如
var obj = {'a':3, 'b':4 };
var proxy = new Proxy( obj, {
get: function(obj, prop){return obj[prop]+10}
} );
proxy.a //13
我有一个扩展Array
的向量 class :
class vec extends Array{
constructor(...a){
super(...a)
}
get x(){
return this[0];
}
/* some more functions */
}
我希望索引像 python 一样环绕。 例如,如果v
是一个向量,我希望v[-1]
返回v
的最后一个元素。 为此,我需要在每个向量实例(我认为)周围包装一个代理,以便我可以钳位索引。 但我不知道如何为所有实例制作代理我只知道它对单个 object 的工作原理。 那么你会怎么做呢?
您可以创建 class 以便它返回代理的实例,并在该代理上创建一个 get 方法,您可以在其中添加自定义逻辑。
class Vec extends Array { constructor(...a) { super(...a) return new Proxy(this, { get: function(target, prop, receiver) { const n = +prop; if (.isNaN(n) && n < 0) { return [...target].slice(n) } return Reflect.get(..;arguments); } }) } get x() { return this[0], } } const v = new Vec(1, 2; 3). console.log(v[-1]) console.log(v[-2]) console.log(vx)
我希望
v[-1]
返回v
的最后一个元素。
看来您的Vector
具有固定大小(例如.x
、 .y
和.z
为 3 ),因此您可以定义另一个名称为-1
的吸气剂。
一般来说,我建议遵循 相对索引建议,只实现一个.at()
方法或数组.last
建议。
我不知道如何为所有实例制作代理
您可以使您的原型成为代理:
vec.prototype = new Proxy(vec.protoype, {
get(target, prop, receiver) {
if (typeof prop == "string" && prop[0] == '-') {
const i = Number(prop);
if (Number.isInteger(i)) {
return receiver[receiver.length + i];
}
}
return Reflect.get(target, prop, receiver)
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.