【问题标题】:Javascript array property in a class only returned if its called from a function [duplicate]仅当从函数调用时才返回类中的 Javascript 数组属性 [重复]
【发布时间】:2018-07-29 07:04:55
【问题描述】:

const Color = {
  RED: 'red',
  GREEN: 'green',
  BLUE: 'blue',

  values: [this.RED, this.GREEN, this.BLUE],

  allValues() {
    return [this.RED, this.GREEN, this.BLUE]
  }
}

console.log(Color.values); // [undefined, undefined, undefined]
console.log(Color.allValues()); // ["red", "green", "blue"]

我最近开始学习 javascript,这让我很吃惊,我会考虑通过将其包装在一个 hacky 函数中来使其工作,并且真的很想避免这样做。我在这里做错了什么?

【问题讨论】:

标签: javascript node.js


【解决方案1】:

这在对象字面量中是不可能的。从文字 this 创建 Object 实例时尚不可用。您可以创建并立即使用某些东西来初始化values,或者使用getter 来设置values 属性(请参阅@James 答案):

// initialization
const Color = {
  RED: 'red',
  GREEN: 'green',
  BLUE: 'blue',
  init() {
    this.values = [this.RED, this.GREEN, this.BLUE];
    return this;
  }
}.init();

console.log(Color.values);

只是为了好玩:如果你想完全排除使用this,这(双关语;)将是 es20xx 的替代品:

const Color = Object.entries({
  RED: 'red',
  GREEN: 'green',
  BLUE: 'blue'})
  .reduce( (o, [key, value]) => 
    ( o.values.push(value), {...o, [key]: value} ), {values: []} );
  
console.log(Color.values);

// Or using this utility method
const objWithValues = o => 
    ({...o, values: Object.entries(o).map(([key, value]) => value) });
const Color2 = objWithValues({
    RED: 'red',
    GREEN: 'green',
    BLUE: 'blue'});

console.log(Color2.values);

【讨论】:

  • 嗯,初始化方法是一个有趣的方法,它解决了每次调用 values() 函数时创建数组的问题。由于我是 JS 新手,这里的规范是什么?在这些场景中使用 getter 是否可以接受,因为有内置的方法可以做到这一点?
  • 在这种情况下,我个人会使用吸气剂。只有在更复杂的情况或具有大量数据的情况下,初始化才可能更有效和/或更方便。
  • 嗯......似乎这个答案被编辑为基本上包括我的,哦,好吧。
  • @James:对不起,我的答案是步骤
  • 不确定我是否购买了那个 tbh,您的第一个答案是明确的“这无法完成”并提供了第一个解决方案作为解决方法,然后几分钟后“您可以使用吸气剂”-您肯定在发布后看到我的答案吗?它几乎是在同一时间发布的。它现在无关紧要,但当它已经被建议时,它并不喜欢整个修改答案。
【解决方案2】:

要回答这个问题,可以通过getter 来完成

const Color = {
  RED: 'red',
  GREEN: 'green',
  BLUE: 'blue',

  get values() {
    return [this.RED, this.GREEN, this.BLUE]
  }
}
...
console.log(Color.values); // ['red', 'green', 'blue']

【讨论】:

  • 这与 OP 的 allValues 方法有何不同
  • @Isaac 因为从语法上讲,OP 获得了调用属性而不是函数的所需行为。
猜你喜欢
  • 1970-01-01
  • 2014-08-17
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 2021-08-30
  • 1970-01-01
相关资源
最近更新 更多