Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript实例级装饰程序_Javascript_Decorator_Babeljs - Fatal编程技术网

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;
};