JavaScript实例级装饰程序
是否可以定义一个装饰器,该装饰器将在建议的当前迭代中在实例级别公开 比如说JavaScript实例级装饰程序,javascript,decorator,babeljs,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)
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)
我想要的行为和我做的一样
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();
}
}
定义类时,装饰器只运行一次,但这并不意味着定义时逻辑不能设置函数来对每个实例执行操作。在这种情况下,您可以通过在prototye级别的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;
};