meg*_*wac 5 javascript decorator babeljs
是否可以定义在提案的当前迭代中在实例级别公开的装饰器
例如
function once(target, name, descriptor) {
let {get} = descriptor;
var called = false, result;
if (typeof get === "function") {
descriptor.get = function() {
console.log(called);
if (!called) {
result = get.apply(this, arguments);
called = true;
}
return result;
}
}
return descriptor;
};
class X {
@once
get y() {
return Math.random();
}
}
var x1 = new X;
var x2 = new X;
// Should be false
console.log(x1.y !== x2.y)
Run Code Online (Sandbox Code Playgroud)
我想要类似的行为
class X2 {
constructor() {
// Set descriptor manually for this instance
let descriptor = Object.getOwnPropertyDescriptor(X2.prototype, 'y');
let d = Object.assign({}, descriptor);
once(X, "y", d);
Object.defineProperty(this, 'y', d);
}
get y() {
return Math.random();
}
}
Run Code Online (Sandbox Code Playgroud)
装饰器仅在定义类时运行一次,但这并不意味着定义时逻辑无法将函数设置为按实例进行处理。在这种情况下,您可以通过在原型级别的getter中定义特定于实例的属性来记住该值。
function once(target, name, descriptor) {
let {get, writable, enumerable} = descriptor;
if (typeof get === "function") {
descriptor.get = function() {
const value = get.apply(this, arguments);
Object.defineProperty(this, name, {
value,
writable,
enumerable
});
return value;
}
}
return descriptor;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1088 次 |
| 最近记录: |