【问题标题】:How can I use the value of a previous object property inside another property of the same object when I am declaring it声明时如何在同一对象的另一个属性中使用前一个对象属性的值
【发布时间】:2019-09-11 22:02:34
【问题描述】:

我有一个类,它返回一个带有属性的对象。我想访问构造函数中前一个道具的值。

我有下一个工作代码:

class KafkaConsumer {
    constructor (metaDataBrokerList, groupID, autoCommit, AutoOffsetReset, topicName) {
        return { 
            consumer: this.create(metaDataBrokerList, groupID, autoCommit, AutoOffsetReset, topicName),
            connect: (consumer) => { this.connect(consumer) }
        };
    }


    create (metaDataBrokerList, groupID, autoCommit, AutoOffsetReset, topicName) {
        var consumer = new Kafka.KafkaConsumer({
            'metadata.broker.list': metaDataBrokerList,
            'group.id': groupID,
            'enable.auto.commit': autoCommit, // don't commit my offset
            'auto.offset.reset': AutoOffsetReset, // consume from the start
        });

        .
        .
        .

        return ( consumer );
    }

    // Conect the consumer
    connect (consumer) {
        consumer.connect();
    }
}

调用是(如您所见,我需要将创建的变量传递给函数'connect'。我想避免这种情况):

let kafkaConsumer = new KafkaConsumer(...props);
// Connect the consumer
kafkaConsumer.connect(kafkaConsumer.consumer);

我想要类似的东西:

class KafkaConsumer {
    constructor (metaDataBrokerList, groupID, autoCommit, AutoOffsetReset, topicName) {
        return { 
            consumer: this.create(metaDataBrokerList, groupID, autoCommit, AutoOffsetReset, topicName),
            connect: this.connect(consumer) 
            // Where 'this.connect' is my function and 'consumer' is the previous prop
        };
    }

    .
    .
    .

}

所以调用应该是:

// Connect the consumer
kafkaConsumer.connect();

【问题讨论】:

  • 一个constructor 不应该return 一个对象。您应该初始化实例上的属性!
  • 我知道,它仅用于测试新事物(我知道在构造函数中返回对象是一种不好的做法)。谢谢你的建议
  • 测试与否,不要做。使用应该使用的class,或者改为编写工厂函数。
  • 什么是工厂函数?
  • 一个普通的 function 返回一个新对象。不要使用class 语法。

标签: javascript class object ecmascript-6


【解决方案1】:

我已经达到了我的目的。我已经将类的每个属性都关联到它的私有函数,因此,每个类属性都是一个调用另一个私有函数的函数:

class KafkaConsumer {
    constructor (metaDataBrokerList, groupID, autoCommit, AutoOffsetReset, topicName) {
        this.consumer = this.p_create(metaDataBrokerList, groupID, autoCommit, AutoOffsetReset, topicName);
        this.connect = () => { this.p_connect() };
    }

    // Conect the consumer
    p_connect () {
        this.consumer.connect();
    }

【讨论】:

    【解决方案2】:

    有点不清楚您要达到的目标。

    • 为什么要在构造函数中返回一些东西?
    • 为什么你需要一个create 方法,它只返回一个带有你在构造函数中的参数的对象?
    • connect 方法应该做什么?

    如果您尝试创建一个消费者对象并返回它,也许这个解决方案对您有用:

    class KafkaConsumer {
        constructor (metaDataBrokerList, groupID, autoCommit, AutoOffsetReset, topicName) {
            this.consumer = {
                'metadata.broker.list': metaDataBrokerList,
                'group.id': groupID,
                'enable.auto.commit': autoCommit, // don't commit my offset
                'auto.offset.reset': AutoOffsetReset, // consume from the start
            }
        }
    
        get() {
            return this.consumer;
        }
    }
    

    并像这样使用它:

    let consumer = new KafkaConsumer(props);
    consumer.get(); // Returns your created consumer
    

    【讨论】:

    • 嗨。我会回答你的问题: 1.- 我想返回一个在类中声明了方法的对象,因为我正在进行测试(它不是用于生产)。 2.- 创建方法 realice 更多动作不仅返回一个对象(参见...-特别是返回一个对象及其 onAction 方法-)在我的问题中是一个简化的示例。 3.- connect 方法应该检索构造函数对象并应用它本身称为“connect()”的属性。我也阅读了您的“get()”提议,但我正在搜索不使用检索消费者财产的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多