如何在 Javascript 中获取计算出的 getter 名称?
How do I get the computed getter name in Javascript?
我有与此类似的代码:
class A {
constructor() {
this._a = 1;
}
get [val]() {
if (val == 'a') {
return this._a;
}
}
}
以上代码无效,因为val
不存在。
我想从 getter
中获取 computed getter
名称并添加到变量 val
,以便我知道正在访问什么 属性。
我怎样才能做到这一点?
您不能使用正常的 class 语法和 getters/setters 来做到这一点。问题是你只能定义 concrete getters.
为了定义拦截 all 调用的 getter,您需要使用 a Proxy
class A {
constructor() {
this._a = 1;
}
}
const handler = {
get: function(obj, prop) {
if (prop == 'a') {
return obj._a;
}
return `getting "${prop}" instead of "a"`;
}
};
const instance = new A();
const p = new Proxy(instance, handler);
console.log(p.a);
console.log(p.b);
console.log(p._a);
如果你想 "hide" 某些字段,比如任何以下划线开头的字段,你可以这样做:
class A {
constructor() {
this._a = 1;
this._b = 2;
this._c = 3;
}
}
const handler = {
get: function(obj, prop) {
const secretProp = `_${prop}`;
//check if a property that starts with underscore is in the source object
if (secretProp in obj) {
return obj[secretProp];
}
return `getting "${prop}" is not allowed`;
}
};
const instance = new A();
const p = new Proxy(instance, handler);
console.log(p.a);
console.log(p.b);
console.log(p.c);
console.log(p._a);
console.log(p._b);
console.log(p._c);
console.log(p.foo);
欢迎来到 Stack Overflow!
您正在寻找的是代理。这些代理不能由普通的 classes 扩展,但您可以确保您的 class 将自己实例化为代理。像这样
class A {
constructor() {
this._a = 1;
return new Proxy(this, {
get: (object, key, proxy) => {
if (key == 'a') {
return object._a;
}
}
});
}
}
let someInstance = new A();
console.log(someInstance.a);
我有与此类似的代码:
class A {
constructor() {
this._a = 1;
}
get [val]() {
if (val == 'a') {
return this._a;
}
}
}
以上代码无效,因为val
不存在。
我想从 getter
中获取 computed getter
名称并添加到变量 val
,以便我知道正在访问什么 属性。
我怎样才能做到这一点?
您不能使用正常的 class 语法和 getters/setters 来做到这一点。问题是你只能定义 concrete getters.
为了定义拦截 all 调用的 getter,您需要使用 a Proxy
class A {
constructor() {
this._a = 1;
}
}
const handler = {
get: function(obj, prop) {
if (prop == 'a') {
return obj._a;
}
return `getting "${prop}" instead of "a"`;
}
};
const instance = new A();
const p = new Proxy(instance, handler);
console.log(p.a);
console.log(p.b);
console.log(p._a);
如果你想 "hide" 某些字段,比如任何以下划线开头的字段,你可以这样做:
class A {
constructor() {
this._a = 1;
this._b = 2;
this._c = 3;
}
}
const handler = {
get: function(obj, prop) {
const secretProp = `_${prop}`;
//check if a property that starts with underscore is in the source object
if (secretProp in obj) {
return obj[secretProp];
}
return `getting "${prop}" is not allowed`;
}
};
const instance = new A();
const p = new Proxy(instance, handler);
console.log(p.a);
console.log(p.b);
console.log(p.c);
console.log(p._a);
console.log(p._b);
console.log(p._c);
console.log(p.foo);
欢迎来到 Stack Overflow!
您正在寻找的是代理。这些代理不能由普通的 classes 扩展,但您可以确保您的 class 将自己实例化为代理。像这样
class A {
constructor() {
this._a = 1;
return new Proxy(this, {
get: (object, key, proxy) => {
if (key == 'a') {
return object._a;
}
}
});
}
}
let someInstance = new A();
console.log(someInstance.a);