获取js类中构造函数的参数

ki1q1bka  于 2021-09-08  发布在  Java
关注(0)|答案(3)|浏览(399)

如何在js中获取构造函数类的参数数组?有可能吗?提前谢谢。

class Product {
    constructor(id, name, price, category, stock){
      this.id = id;
      this.name = name;
      this.price = price;
      this.category = category;
      this.stock = stock;
    }  
};

console.log(Product.constructor.params);

//expected output = ['id', 'name', 'price', 'category', 'stock'];
zpgglvta

zpgglvta1#

受@porter answer和@evolutionxbox的启发,我认为使用 .match() 这样地:

class Product {
  constructor(id, name, price, category, stock, unusedArgument) {
    this.id = id;
    this.name = name;
    this.price = price;
    this.category = category;
    this.stock = stock;
  }
}

class Noarguments {
  constructor() {
  }
}

// A function
function getClassContructorParams(obj){
  let match = obj.toString().match(/constructor\((.+)\)/)

  if(match && match[1]){
    return match[1].split(",");
  }

  // If no match
  return []  
}

console.log(getClassContructorParams(Product))

/// Testing a class with no constructor arguments will return an empty array
console.log(getClassContructorParams(Noarguments))

我之前的回答是返回对象属性,这可能与构造函数中使用的参数不同。。。
现在使用 .match() 将确保返回的是真正的 constructor 论据。

m0rkklqb

m0rkklqb2#

let s = Product.toString();
let params = s.substring(s.indexOf('(')+1, s.indexOf(')')).split(',')
vktxenjb

vktxenjb3#

我在评论中的观点是,你似乎从错误的方向来解决这个问题。也许采取这种方法。具有标签数组和数据数组,并将它们传递到类中。您仍然可以在其他代码中访问(和验证)标签数组,而且一切都可以正常工作。

const labels = [ 'id', 'name', 'price', 'category', 'stock' ];

const data = [ 1, 'Bob', 100, 2, 1];

class Product {

    constructor(labels, data) {
      data.forEach((el, i) => this[labels[i]] = el);
    }

};

console.log(new Product(labels, data));
console.log(labels);

或者,如果您的产品在属性方面是相同的,您可以使用它们的数组,然后使用 Object.keys 获取第一个对象的标签。

const data = [{ id: 1, name: 'Bob', price: 100, category: 2, stock: 1 }];
const labels = Object.keys(data[0]);

class Product {

    constructor(data) {
      for (let key in data) {
        this[key] = data[key];
      }
    }

};

console.log(new Product(data[0]));
console.log(labels);

相关问题